题意:输入N个上课时间,让你安排考试时间。如果上课时间没有冲突则说明同一个人可以上这两门课,则不能把这些课的考试安排在同一天,如果上课时间有冲突,说明一个人不可能同时上这两门课,则这两门课可以在同一天安排考试(就是说一个人一天只能考一门),说白了就是贪心。
思路:这是道普通的贪心题,但是由于我没有更新在同一天安排考试的课程的结束时间,WA出了翔,以后要注意。
比较有意思的一点,有一次我提交没有把输出排序后结果的for循环注释掉,提交居然TLE了,总共才4个100000次的O(n)*case数,4秒的时间,就给T了。。。注释掉之后3个100000次的O(n)*case数 520ms AC
#include<cstdio> #include<cstring> #include<iostream> #include<cctype> #include<cmath> #include<algorithm> using namespace std; struct node{ int s,t,flag=0,n; }a[100005]; bool cmp(node a,node b) { if(a.s==b.s) return a.t<b.t; else return a.s<b.s; } bool cmp2(node a,node b){ if(a.flag==b.flag) return a.n<b.n; else return a.flag<b.flag; } int main() { int n,i,maxm; int sum=1; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++){ scanf("%d%d",&a[i].s,&a[i].t); a[i].n=i+1; } sum = 1; sort(a,a+n,cmp); a[0].flag = sum; for(i=1;i<n;i++){ if(a[i].s>=a[i-1].t){ sum++; a[i].flag = sum; } else{ a[i].flag = sum; a[i].t=min(a[i].t,a[i-1].t); } } sort(a,a+n,cmp2); /*for(i=0;i<n;i++){ cout<<a[i].s<<" "<<a[i].t<<" "<<a[i].flag<<endl; }*/ maxm=a[0].flag; printf("%d\n",sum); printf("%d",a[0].n); for(i=1;i<n;i++){ if(a[i].flag>maxm){ printf("\n"); printf("%d",a[i].n); maxm = a[i].flag; } else printf(" %d",a[i].n); } printf("\n\n"); } return 0; } /* 8 1 7 0 1 1 2 0 4 2 3 4 6 5 7 6 7 */