POJ 2376 Cleaning Shifts

来源:互联网 发布:数据可视化职位 编辑:程序博客网 时间:2024/05/17 17:55

题意:给出了n只牛的工作时间以及总的工作时间t,求最少用多少牛就可以把1-t的时间覆盖完。

题目好多坑- -,

1.如果起始时间的最小值不是1就不能开始工作。

2.加入某只牛在t1时间结束,那么接班的那只牛可以再t1+1时间开始工作。

3.这一点大家都一般都不会掉进去,我掉进去了- -,排序先按照起始时间排序再按照结束时间排序,忘记考虑某些起始时间比较小,但是结束时间比较晚的情况了。


#include<stdio.h>#include<string.h>#include<stdlib.h>#include<iostream>#include<algorithm>using namespace std;struct node{    int x,y;}s[30000];int cmp(const void *a,const void *b){    if((*(node*)a).x==(*(node*)b).x)        return (*(node*)a).y-(*(node*)b).y;    return (*(node*)a).x-(*(node*)b).x;}int main(){    int n,t;    while(cin>>n>>t)    {        for(int i=0;i<n;i++)            cin>>s[i].x>>s[i].y;        qsort(s,n,sizeof(node),cmp);        s[n].x=0x7fffffff;        int ans=0,pos=0;//pos代表当前位置,因为第一次开始时间必须是1,就先设置成0        int i=0;        while(i<n)        {            int maxend=-1;            if(pos+1<s[i].x)                break;            while(pos+1>=s[i].x&&i<n)//找到当前时间前的所有牛的最大结束时间            {                if(s[i].y>maxend)                    maxend=s[i].y;                i++;            }            ans++;            pos=maxend;            if(pos>=t)                break;        }        if(pos>=t)        cout<<ans<<endl;        else            cout<<-1<<endl;    }    return 0;}


0 0
原创粉丝点击