poj 2376

来源:互联网 发布:谷歌人工智能 开源 编辑:程序博客网 时间:2024/05/29 10:59

思路如下,

首先看最大的和最小是否把1到t包含,如果不能包含,输出-1

剩下的就贪心,在s小于当前的e+1时找最大的e,如果找不到,就退出,输出-1

否则就输出结果。

代码如下

#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>using namespace std;struct Node{int s,e;}a[25005],temp;bool cmp(Node a,Node b){if(a.s!=b.s)return a.s<b.s;elsereturn a.e<b.e;}int main(){int n,t;scanf("%d %d",&n,&t);int mi=1000005,ma=0;for(int i=0;i<n;i++){scanf("%d %d",&a[i].s,&a[i].e);mi=min(mi,a[i].s); ma=max(ma,a[i].e);}if(mi>1||ma<t) printf("-1\n");else{sort(a,a+n,cmp);temp=a[0];for(int i=0;i<n;i++){if(a[i].s!=a[0].s) break;temp=a[i]; }int flag=0;int cnt=1;while(temp.e<t&&flag==0){cnt++;int p=-1,ee=temp.e;for(int i=0;i<n;i++){if(a[i].s>temp.e+1) break;if(a[i].e>ee) {ee=a[i].e; p=i;}}if(p==-1) flag=1;else{temp=a[p];}}if(flag==1) printf("-1\n");else printf("%d\n",cnt);} }


原创粉丝点击