poj2376 Cleaning Shifts

来源:互联网 发布:知乎 西方哲学史 编辑:程序博客网 时间:2024/04/30 07:09

也是贪心 不过这道随便想想就明白了。。

按起点先后排序,第一个点肯定要选,每次在上一个的终点或者终点+1为起点的点里面选一个终点最远的。


#include <iostream>#include <cstring>#include <string>#include <cstdio>#include <cmath>#include <algorithm>#include <vector>#include <queue>#include <map>#define inf 0x3f3f3f3fusing namespace std;struct node{    int s,e;}cow[25010];int cmp(node a,node b){    if(a.s==b.s) return a.e>b.e;    return a.s<b.s;}int main(){    int n,t,i,j,cnt,tmp,ans;    while(~scanf("%d%d",&n,&t))    {        for(i=0;i<n;i++)            scanf("%d%d",&cow[i].s,&cow[i].e);        sort(cow,cow+n,cmp);        if(cow[0].s>1)        {            printf("-1\n");            continue;        }        ans=1;cnt=0;        for(i=0;i<n;)        {            tmp=0;            for(j=i+1;j<n;j++)            {                if(cow[j].s>cow[cnt].e+1) break;                if(cow[j].s>=cow[cnt].s&& cow[j].e>cow[cnt].e)                    if(cow[j].e>cow[tmp].e) tmp=j;            }            if(!tmp) i++;            else            {                cnt=tmp;                ans++;                i=cnt;            }        }        if(cow[cnt].e==t)            printf("%d\n",ans);        else printf("-1\n");    }    return 0;}


0 0