2 2 1 10 10 11 3 1 10 10 11 11 20
1 2
注意:如果上一个活动在t时间结束,下一个活动最早应该在t+1时间开始
算法分析:
不重叠区间调度问题,一般会有三种可想到的算法:
1.在可选的工作中,每次都选取结束时间最早的工作。
2.在可选的工作中,每次都选取用时最短的工作。
3.在可选的工作中,每次都选取与最少可选工作有重叠的工作。
事实证明,只有一才是正确经得住考验的。
对于第一种算法,该算法在选取了相同数量的更早开始的工作时,其最终结束时间不会比其他方案更晚。
也就是说,最早结束的那条区间后面的数量一定大于等于其他后面区间的区间数量。
具体证明请参考:http://blog.csdn.net/luoweifu/article/details/18195607
代码如下:
#include<iostream> #include<utility> #include<algorithm> using namespace std; typedef pair<int,int>name; name arr[10005]; int cmp(name a,name b) {return a.second<b.second;} int main() { int N,n,i,ans,t; cin>>N; while(N--) { cin>>n; for(i=0;i<n;i++) cin>>arr[i].first>>arr[i].second; sort(arr,arr+n,cmp); ans=0,t=-1; for(i=0;i<n;i++){ if(t<arr[i].first) {ans++;t=arr[i].second;} } cout<<ans<<endl; } return 0; }
原文地址:http://blog.csdn.net/u014492609/article/details/40918095