POJ 2376 Cleaning Shifts(贪心)
2015-08-27 09:40
351 查看
Description
有一些奶牛,每只奶牛负责一个时间段。问覆盖完全部的时间段最少需要多少只奶牛。若不能全部覆盖,输出-1
Input
第一行为两个整数N和T表示奶牛数量和总时间,之后N行每行两个整数表示该头奶牛负责的时间段
Output
若能覆盖完全部的时间段输出最少奶牛数量,若不能全部覆盖,输出-1
Sample Input
3 10
1 7
3 6
6 10
Sample Output
2
Solution
贪心法,设t为当前所有已确定区间的最右端,那我们可以每次都取所有可选的小区间(左端点<=t+1)中右端点最大的值,然后更新最右端点ans++,初始时t=0。而由于如果有解t的值是递增的,那每次选区的区间的左端点也必然是递增的,所以先排序然后扫描
Code
有一些奶牛,每只奶牛负责一个时间段。问覆盖完全部的时间段最少需要多少只奶牛。若不能全部覆盖,输出-1
Input
第一行为两个整数N和T表示奶牛数量和总时间,之后N行每行两个整数表示该头奶牛负责的时间段
Output
若能覆盖完全部的时间段输出最少奶牛数量,若不能全部覆盖,输出-1
Sample Input
3 10
1 7
3 6
6 10
Sample Output
2
Solution
贪心法,设t为当前所有已确定区间的最右端,那我们可以每次都取所有可选的小区间(左端点<=t+1)中右端点最大的值,然后更新最右端点ans++,初始时t=0。而由于如果有解t的值是递增的,那每次选区的区间的左端点也必然是递增的,所以先排序然后扫描
Code
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int n,t; struct node { int s,e; }cow[25001]; int cmp(node a,node b)//对区间左端点升序排 { return a.s<b.s; } int main() { scanf("%d%d",&n,&t); for(int i=0;i<n;i++) scanf("%d%d",&cow[i].s,&cow[i].e); sort(cow,cow+n,cmp); int temp=0,ans=0,i=0; while(temp<t&&i<n) { ans++; int top=temp; if(cow[i].s>temp+1)//无法全部覆盖 break; while(cow[i].s<=temp+1&&i<n)//在可选区间内选取右端点最大值 { top=max(top,cow[i].e); i++; } temp=top;//更新最右端点 } if(temp<t)//无法全部覆盖 printf("-1\n"); else//可以全部覆盖 printf("%d\n",ans); return 0; }
相关文章推荐
- POJ 2371 Questions and answers(水~)
- [笔试]几种常见的排序算法对比
- HDU2852 KiKi's K-Number 线段树单点更新
- Android开发关于onActivityResult()的执行时间问题
- Eclipse个性化设置
- 找新朋友 HDU杭电1286 【欧拉函数】
- linux kvm虚拟机 NAT/BRIDGE配置
- 黄聪:让WordPress主题支持语言本地化(使用poedit软件实现中文翻译功能)
- 大话存储3——硬盘接口技术, 内部和外部传输速度
- iOS使用技巧---高效使用你的xcode
- 学习日志---矩阵表示及特殊矩阵压缩
- GDB 总结
- jQuery实现的数值范围range2dslider选取插件特效多款代码分享
- POJ 2365 Rope(计算几何)
- POJ---2352-Stars(树状数组)
- 【基础dp】Piggy-Bank
- Unity3d之Quaternion 学习与应用
- two sum
- 中兴第一次对外发布4G LTE的M2M模块---ESM
- Thirft框架介绍