题目分析:先将事情的起始时间和截止时间排序,把相互排斥的事情划到一个集合里。样例:
0 1 2 ; 3 3; 4 5 6 8; 10; 15 15
7 3 9 ; 4 8; 14 10 12 18; 15; 19 20
^ ^ ^ ^ ^
就会发现每个集合里,被选取的起始时间和截止时间最短的那个事情.....
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct node { int s,e; }arr[110]; int cmp(node x,node y) { if(x.s==y.s) return x.e<y.e; else return x.s<y.s; } int main() { int n,i; while(scanf("%d",&n)!=EOF&&n!=0) { for(i=1;i<=n;i++) scanf("%d %d",&arr[i].s,&arr[i].e); sort(arr+1,arr+1+n,cmp); int ts=arr[1].s; int te=arr[1].e; int ans=1; for(i=2;i<=n;i++) { //寻找每一个集合里的最小一对 if(arr[i].s<te /*&& (arr[i].e-arr[i].s<te-ts)*/ ) { if(arr[i].e-arr[i].s<te-ts) { ts=arr[i].s; te=arr[i].e; //printf("%d %d***\n",te,ts); } } else { ans++; ts=arr[i].s; te=arr[i].e; //printf("%d %d***\n",te,ts); } } printf("%d\n",ans); } //system("pause"); return 0; }