poj2376 快排+贪心

来源:互联网 发布:魔龙诀进价数据 编辑:程序博客网 时间:2024/05/03 11:06
#include<iostream>using namespace std;typedef struct fun{int begin,end;}rr;fun a[25005];int b[1000000];int cmp(const void *a,const void *b){fun *c=(fun *)a;fun *d=(fun *)b;    if(c->begin==d->begin)return d->end-c->end;elsereturn c->begin-d->begin;}int main(){int n,t,i,j;scanf("%d%d",&n,&t);for(i=0; i<n;i++)scanf("%d%d",&a[i].begin,&a[i].end);qsort(a,n,sizeof(fun),cmp);//for(i=0; i<n; i++)//printf("%d   %d\n",a[i].begin,a[i].end);for(i=1; i<=t; i++)b[i]=-1;b[0]=0;for(i=a[0].begin; i<=a[0].end; i++)//代表在那个位置最少需要一个的b[i]=1;int sign=0,m;for(i=1; i<n; i++){if(b[a[i].end]!=-1)//如果前面的已经将第a[i].end填满的话就不需要啦!{continue;}m=b[a[i].begin-1];//最开始的那个最小值的for(j=a[i].begin;j<=a[i].end; j++){if(b[j]!=-1)//之前的那个肯定比这个小的{if(b[j]>m+1)b[j]=m+1;             continue;}else{if(b[j-1]==-1)//肯定有的时间是不行的{sign=1;break;}else{for(int k=j; k<=a[i].end; k++)//将下面的都做上标记的b[k]=m+1;break;}}}//for(j=1; j<=t; j++)//printf("%d  ",b[j]);//cout<<endl;if(sign==1)break;}for(i=1; i<=t; i++)//代表的是错的!if(b[i]==-1)sign=1;if(sign==1)printf("-1\n");elseprintf("%d\n",b[t]);return 0;}


题目链接:http://poj.org/problem?id=2376

首先感谢大神们提供的测试数据,我自己测试了好多,都没有发现错误,但是别人的数据就让我一下发现了错误啊!哈哈!

先说下思路:定义一个结构体,对数据进行二次排序,begin点进行升序排列,begin点相同的读end点进行降序排列;

建立一个一维数组b[1000000],b[i]代表从0到i中需要排满所有的清洁所需的最少的cow,然后最后输出b[t]j即可,

对于b[i]的求法使用贪心的思路,从i到n开始循环,如果存在可能比现有的b[i]小的值就替换现有的b[i]的值即可得!

代码如下:

 

原创粉丝点击