题意:给出n个区间[a,b),有2个记录器,每个记录器中存放的区间不能重叠。求2个记录器中最多可放多少个区间。

解法:贪心。只有1个记录器的做法详见——关于贪心算法的经典问题(算法效率 or 动态规划)。而对于2个,就是在1个的基础上(按 bi 排序,选第一个与之前没有相交的区间)维护2个值,注意要好好for循环遍历一次O(n),若想着用while直接跳过一些区间很容易出错!!!另外,遍历时要先考虑能否把当前的区间接在之前右端点较右的记录器。

 1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<iostream>
5 #include<algorithm>
6 using namespace std;
7
8 const int N=155;
9 struct node{int l,r;}a[N];
10
11 int read()
12 {
13 char ch=getchar();
14 int x=0;
15 while (ch<'0'||ch>'9') ch=getchar();
16 while (ch>='0'&&ch<='9') x=x*10+ch-'0', ch=getchar();
17 return x;
18 }
19 bool cmp(node x,node y) {return x.r<y.r;}
20 int main()
21 {
22 int n=read();
23 for (int i=1;i<=n;i++)
24 {
25 a[i].l=read(),a[i].r=read();
26 if (a[i].l>a[i].r) {int t;t=a[i].l,a[i].l=a[i].r,a[i].r=t;}
27 }
28 sort(a+1,a+1+n,cmp);
29 int cnt=0,x=0,y=0;
30 for (int i=1;i<=n;i++)
31 {
32 if (x<=a[i].l) cnt++,x=a[i].r;
33 else if (y<=a[i].l) cnt++,y=a[i].r;
34 if (x<y) {int tmp;tmp=x,x=y,y=tmp;}
35 }
36 printf("%d\n",cnt);
37 return 0;
38 }

最新文章

  1. C语言图形库简单对比及EGE库的安装小手册
  2. 【ionic】微信表情设置教程
  3. PhpStorm中文教程
  4. IOS 用正则表达式解析HTML等文件,得到所有文本
  5. centos下apache安装后无法访问
  6. vs 设置生成的实体为复数
  7. 作了点有意义 的事,加入CLOUDSTACK官方文档的中文翻译工作
  8. 解决.net中截取字符串的汉字与数字还有静态扩展方法
  9. mockjax MOCK.js的拦截ajax请求
  10. Xamarin for android:为button设置click事件的几种方法
  11. 自己动手写spring容器(3)
  12. javascript-变量-作用域
  13. ubunt tftp服务器搭建
  14. HTML5可以省略结束标记的元素
  15. HTML5 全屏 API
  16. day02python基本数据类型
  17. 面向对象(metaclass继承高级用法)
  18. Windows 7下载安装 Visual C++ 6.0(VC6) 全程图解
  19. Json转换工具类(基于google的Gson和阿里的fastjson)
  20. window wlan 相关服务

热门文章

  1. 一文读懂 SuperEdge 边缘容器架构与原理
  2. 【Java基础】反射
  3. Python3爬取小说并保存到文件
  4. 关联实现上-jsonpath取值
  5. (二)数据源处理2-xlrd操作excel
  6. 【Git】3、创建Git版本库、配置Git仓库用户邮箱信息
  7. 【EXP/IMP】问题总结
  8. C++:标准I/O流
  9. 干电池升压IC
  10. 解决JS获取中文参数出现的乱码问题