活动选择
D14554. 活動選擇
時間限制:1.0s ? 內存限制:256.0MB ? 代碼提交間隔:1分鐘(現在可以提交) ?
輸入文件名:test.in ? 輸出文件名:test.out
問題描述
假設有一個需要使用某一資源的n個活動組成的集合S,S={1,…,n}。該資源一次只能被一個活動所占用,每一個活動有一個開始時間bi和結束時間ei(bi<=ei)。若bi>ej或者bj>ei,則活動兼容。
你的任務是:選擇由互相兼容的活動組成的最大集合中元素的個數。
輸入格式
共n+1行,其中第1行為n,第2行到第n+1行表示n個活動的開始時間和結束時間(中間用空格隔開),格式為:
n
b1 e1
……
bn en
(注:所有數據不超過整型)
輸出格式
一個整數,表示可以兼容活動的最大個數。
樣例輸入
11
3 5
1 4
12 14
8 12
0 6
8 11
6 10
5 7
3 8
5 9
2 13
樣例輸出
4
?
思路:
各個區間不能重疊。
貪心策略:
按照結束時間排序,記錄當前最后結束時間,判斷第i區間是否可以選中,若可以修改最大結束時間的值,ans+1,反之不理它。
證明:
當前有第一個區間和第i個區間,如若兩者不沖突,都可以選中,自然能多選,反之第一個區間結束時間更早,影響后續選擇的可能就小,如此必選靠前的區間。
實現時使用pair定義結構體,排序時可以默認優先級。
Code:
#include<bits/stdc++.h>#define e first#define b secondusing namespace std;int n, ans = 0;pair <int, int> act[100010];int main(){freopen("test.in","r",stdin);freopen("test.out","w",stdout);cin >> n;for (int i = 1; i <= n; i++)cin >> act[i].b >> act[i].e;sort(act + 1, act + n + 1);int last = 0;for (int i = 1; i <= n; i++) {if (act[i].b > last) {ans++;last = act[i].e;}/沖突性判斷}cout << ans << endl;return 0;}?
轉載于:https://www.cnblogs.com/sun915/p/9494077.html
總結
- 上一篇: 【原创】从 列表的重复 到 用sum展开
- 下一篇: 如何在 macOS 上安装Axure R