标签:
每组的输出占一行
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;
}。坑爹的,WA一个。实现。
版权声明:本文博客原创文章。博客,未经同意,不得转载。
标签:
原文地址:http://www.cnblogs.com/mengfanrong/p/4677098.html