poj2376 Cleaning Shifts(区间贪心)
2016-03-18 00:22
363 查看
题意:给你n组区间,和一个范围M,每个区间起点终点,你选择最少的区间,把整个范围M铺满。
贪心:对区间起点,终点排序后,选择下一个能选的所有区间里,终点最远的。
贪心:对区间起点,终点排序后,选择下一个能选的所有区间里,终点最远的。
#include <fstream> #include <iostream> #include <string> #include <cstring> #include <complex> #include <math.h> #include <set> #include <vector> #include <map> #include <queue> #include <stdio.h> #include <stack> #include <algorithm> #include <list> #include <ctime> #include <ctime> #include <assert.h> #define rep(i,a,n) for (int i=a;i<n;i++) #define per(i,a,n) for (int i=n-1;i>=a;i--) #define pb push_back #define mp make_pair #define all(x) (x).begin(),(x).end() #define fi first #define se second #define eps 1e-8 #define M_PI 3.141592653589793 typedef long long ll; const ll mod=1000000007; const int inf=0x7fffffff; ll powmod(ll a,ll b) {ll res=1;a%=mod;for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;} using namespace std; struct node { int x,y; }a[25000+10]; bool cmp(node a,node b) { if(a.x==b.x) return a.y<b.y; else return a.x<b.x; } int main() { int n,m; while(~scanf("%d%d",&n,&m)){ int Max=0; for(int i=0;i<n;i++) { scanf("%d%d",&a[i].x,&a[i].y); Max=max(Max,a[i].y);} sort(a,a+n,cmp); if(a[0].x > 1){ printf("-1\n"); continue; } int cur=0,ans=1; for(int i=0;i<n;){ int temp=0; for(int j=i+1;j<n;j++){ if(a[j].x>a[cur].y+1) break; if(a[j].y>a[cur].y){ if(a[j].y>a[temp].y){ temp=j; } } } if(temp==0){ i++; } else{ cur=temp; ans++; i=cur; } } if(a[cur].y==m) printf("%d\n",ans); else printf("-1\n"); } }
相关文章推荐
- vs2008编译QT开源项目--太阳神三国杀源码分析(三) 皮肤
- 再看《JavaScript高级程序设计》第5章
- 合法提交Html标签 Page指令
- 质方数
- 堆和栈区别
- 读取并修改元素的内容:选中项左右移动
- QT断点续传(原理:需要在HTTP请求的header中添加Rang节,告诉服务器从文件的那个位置开始传输.格式为bytes 开始传输的位置)
- HDU-2829 Lawrence (DP+四边形不等式优化)
- [BZOJ3404][Usaco2009 Open]Cow Digit Game又见数字游戏
- 转载的一篇php代码的执行流程
- Objective-C中谓词(NSPredicate)的应用
- Object对象之equals方法
- QT插件开发方式(没看懂)
- java 时间戳与日期字符串相互转换
- git for mac
- 通过EPROCESS获取进程名
- Qt调用WebService
- keystone v2 to v3
- Linux文件编程总结
- Android界面实现