題目描述:設有n個活動的集合,其中每個活動都要求使用同一個資源,而在同一時間內只有一個活動能夠使用這一資源,每個活動i都有一個要求使用該資源的起始時間si和一個結束時間fi(si<fi),如果選擇了活動i,則他在時間區間[si,fi)占用資源。求最多可以進行多少個活動。
【輸入格式】第一行一個正整數n(n<1000),接下來n行,每行兩個整數si和fi
【輸出格式】輸出盡可能多的相互兼容的活動個數
貪心策略:首先需要以每個活動的結束時間為基準排序(很多問題都需要排序,我們只能在有序中確定策略,凌亂的數據中確定策略顯然是夢話。對于這個問題有兩個可能的基準:開始時間和結束時間,然后再選擇思考順序:從前往后和從后往前),這里我們選擇從前往后思考(至于為什么是這樣只能說在思考問題的過程中試出來這樣可以解決問題)。
然后從前往后選擇活動,如果不沖突就選上。
正確性:對于兩個沖突的活動,選擇前面的更優:前面的結束時間更早,對后面的影響更小。
對于兩個不沖突活動,就選上,活動數更多。
綜上:策略正確
代碼:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,cnt,t;
struct node
{int s,f;
}a[1005];
bool cmp(node a,node b)
{return a.f<b.f;
}
int main()
{scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d%d",&a[i].s,&a[i].f);}sort(a,a+n,cmp);t=0; cnt=0;for(int i=0;i<n;i++){if(a[i].s>=t){t=a[i].f;cnt++;}}printf("%d",cnt);return 0;
}