POJ 1716 Integer Intervals

来源:互联网 发布:java微信扫码支付开发 编辑:程序博客网 时间:2024/05/20 14:42

此题属于贪心类型。题的大意就是说在数轴上给n个区间,让你找一个点集,使这个点集和每个区间的交点至少有两个。让你求这个点集至少有几个点。大体思路是先让这些区间的最后一个数从小到大排序。然后让此区间的第一个数和前一个区间最后一个数和最后一个数比较。一开始我做此题想多了,把类分多了,分多的类都在我的代码中注释了,看一下吧,希望别犯和我一样的错误。

#include <stdio.h>#include <algorithm>using namespace std;struct sa{int start;int end;} data[10000];int cmp(sa a,sa b){return a.end<b.end;}int main(){int n;int x[10000],y[10000];while(scanf("%d",&n)!=EOF){int count=2;for(int a=0;a<n;a++){  scanf("%d%d",&data[a].start,&data[a].end);  }        sort(data,data+n,cmp);for(int c=0;c<n;c++){x[c]=data[c].end-1;    y[c]=data[c].end;}    intmax=y[0];    int daoer=x[0];for(int b=1;b<n;b++){if(data[b].start<=daoer) {                /*if(data[b+1].end<=daoer)                {                max=y[b];                daoer=x[b];                }                if(data[b].end==max) continue;                if(data[b].end>max)     {     max=y[b];     daoer=x[b];     }*/     continue;}else if(data[b].start<=max){count++;daoer=max;max=y[b];}else{count+=2;max=y[b];daoer=x[b];}}printf("%d\n",count);}return 0;}

原创粉丝点击