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]的值即可得!
代码如下:
- poj2376 快排+贪心
- poj2376(贪心+快排)
- poj1328 快排+贪心
- poj2376 贪心
- 贪心:POJ2376
- POJ2376(贪心)
- poj2376(贪心)
- 0.9poj2376(贪心)
- POJ2376 Cleaning Shifts 贪心
- poj2376 Cleaning Shifts 贪心
- POJ2376 Cleaning Shifts(贪心)
- POJ2376 Cleaning Shifts 【贪心】
- poj2376区间贪心
- poj2376(贪心)
- POJ2376贪心Cleaning Shifts
- poj2376 贪心算法
- POJ2376 Cleaning Shifts(贪心)
- POJ2376 Cleaning Shifts (贪心)
- Oracle常用EVENT参考
- navicat for mysql 显示中文乱码解决办法
- JNDI 介绍和Ldap简介
- gson使用在android使用例子
- c# 学习总结
- poj2376 快排+贪心
- 导出库的表结构
- usbhw.c
- Logcat过滤及常见用法整理
- P/Invoke使用Win32非托管函数
- Hadoop集群部署及常见问题解答【超详细】
- 两串BCD码的对比
- linux下echo命令详解
- 最全ASCII码对照表