题意:输入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
*/