code1214 线段覆盖
2016-05-14 10:23
381 查看
贪心
把线段们按终止点b的先后排序,b小的在前面,b一样随便
然后设r为当前最大的b
每加入一条新的线段i,判断是否重合(i.a>=r)
如果重合就舍弃i,否则把i加入,ans++,更新r:r=i.b
证明:
加入有这样几条线段:
1:------
2: ----
3: ------------
4: ---------------
请问1、2、3是重合的,你选那条?
一定是选b最小的1,因为那样对后面选线段的影响就尽量小,就有可能选到更多线段(比如4,而一开始选3就不行)
代码:
把线段们按终止点b的先后排序,b小的在前面,b一样随便
然后设r为当前最大的b
每加入一条新的线段i,判断是否重合(i.a>=r)
如果重合就舍弃i,否则把i加入,ans++,更新r:r=i.b
证明:
加入有这样几条线段:
1:------
2: ----
3: ------------
4: ---------------
请问1、2、3是重合的,你选那条?
一定是选b最小的1,因为那样对后面选线段的影响就尽量小,就有可能选到更多线段(比如4,而一开始选3就不行)
代码:
#include<iostream> #include<algorithm> #define Size 105 using namespace std; int n; struct L{ int a,b; }d[Size]; bool cnt(L x,L y){ return x.b<y.b; //b小的在前面,b一样随便 } int main(){ freopen("1214.in","r",stdin); cin>>n; int x,y; for(int i=1;i<=n;i++){ cin>>x>>y; if(x>y)swap(x,y); d[i].a=x; d[i].b=y; } sort(d+1,d+1+n,cnt); int r=-0x3f3f3f3f; int ans=0; for(int i=1;i<=n;i++){ if(d[i].a>=r){ //cout<<i<<endl; ans++; r=d[i].b; } } cout<<ans<<endl; fclose(stdin); return 0; }
相关文章推荐
- Git使用之SourceTree
- vector 用法
- java md5,md2,md4 加密算法
- Python HTML操作(HTMLParser)
- android关于AndroidManifest.xml详细分析
- android studio中去掉默认的标题栏
- 字符串函数-strcpy
- iOS学习网站
- CSS中的#和.
- HDU 1247 Hat’s Words
- nginx无法编译的解决方法
- 网络请求
- 阶梯问题 动态规划浅析
- volatile、native、synchronized
- 安卓中修改Toast显示位置和内容
- Shell命令行快捷键
- 【知识积累】Oracle数据库安装配置
- 交换函数
- 自动对齐选择标签的做法
- java并发编程---线程池