poj 2376 Cleaing Shifts

来源:互联网 发布:淘宝下载到电脑桌面 编辑:程序博客网 时间:2024/05/29 03:10

蛮简单,贪心。

先找1开头的最远的

然后以原来右端点左边一点为起点,以现在的右端点为终点,继续搜索最远右端点,当超过现在最远右端点时,弹出,将现在右端点的左边一个点作为下次搜索的起点,下次搜索的右边端点在本次搜索过程中会得到。

有点混人

#include<algorithm>#include<iostream>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<set>using namespace std;struct interval{int left;int right;bool isused;}interv[33333];bool isused[33333];int cmp(const void *a,const void *b){interval* p1;interval* p2;p1=(interval*)a;p2=(interval*)b;if(p1->left!=p2->left)return p1->left-p2->left;elsereturn p1->right-p2->right;}int main(){    //freopen("H:\\in.txt","r",stdin);int N,T;cin>>N>>T;for(int i=0;i<N;i++){cin>>interv[i].left>>interv[i].right;}qsort(interv,N,sizeof(interval),cmp);int maxtime=0;int firstIntervLeftis2=0;for(int i=0;i<N;i++){if(interv[i].left==1&&interv[i].right>maxtime)maxtime=interv[i].right;        else if(interv[i].left>1)        {            firstIntervLeftis2=i-1;            break;        }}if(maxtime==0){printf("-1\n");return 0;}int count=1;int start=firstIntervLeftis2;while(maxtime<T){bool isupdate=false;int tmpmax=maxtime;for(int i=start;i<N;i++){if(interv[i].left<=maxtime+1&&interv[i].right>tmpmax)//本次搜索起点start是上次的终点,本次搜索会得到下次搜索的终点,本次终点由上次搜索得到{tmpmax=interv[i].right;isupdate=true;}else if(interv[i].left>maxtime)            {                start=i-1;                break;            }}if(isupdate){maxtime=tmpmax;count++;}else{printf("-1\n");return 0;}}printf("%d\n",count);return 0;}


0 0
原创粉丝点击