现在的位置: 首页 > 综合 > 正文

ZOJ–3721–Final Exam Arrangement【贪心】

2018年04月24日 ⁄ 综合 ⁄ 共 1150字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.