NYOJ 891 找点 (贪心&区间选点)
2015-09-24 11:01
267 查看
找点
时间限制:2000 ms | 内存限制:65535 KB难度:2
描述
上数学课时,老师给了LYH一些闭区间,让他取尽量少的点,使得每个闭区间内至少有一个点。但是这几天LYH太忙了,你们帮帮他吗?
输入多组测试数据。
每组数据先输入一个N,表示有N个闭区间(N≤100)。
接下来N行,每行输入两个数a,b(0≤a≤b≤100),表示区间的两个端点。
输出输出一个整数,表示最少需要找几个点。
样例输入
4 1 5 2 4 1 4 2 3 3 1 2 3 4 5 6 1 2 2
样例输出
1 3 1
注 - 此题为 :NYOJ 891 找点 (贪心&区间选点)
贪心算法:区间选点
例如1:(示例数据 1 排序后的数据)
2 3 开始必有一点 cnt = 1 ; 记录右端的值 a = 3
1 4 左端的 1 小于a , 不用选点 ; 不用更新 右端的值 a 仍为 3
2 4 左端的 2 小于 a, 不用选点 ; 不用更新 右端的值 a 仍为 3
1 5 左端的 1 小于a , 不用选点 ; 不用更新 右端的值 a 仍为 3
所以 所选点数 cnt = 1.
例如2:(示例数据 2 排序后的数据)
1 2 开始必有一点 cnt=1; 记录右端的值 a=2
3 4 左端的 3 大于a , cnt ++ ; 更新 右端的值 a=4
5 6 左端的 5 大于a, cnt ++ ; 更新 右端的值a=6
所以 所选点数 cnt = 3
已AC代码:
#include<cstdio> #include<algorithm> using namespace std; struct node{ int left,right; }s[110]; bool cmp(node a,node b) //依右端从小到大排序 { return a.right<b.right; } int main() { int n,i,a,cnt; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;++i) scanf("%d%d",&s[i].left,&s[i].right); sort(s,s+n,cmp);//排序 cnt=1;a=s[0].right;//最小的右端点 for(i=1;i<n;++i) { if(a<s[i].left)//如果下一个的左端点大于 a { cnt++; //点数加一 a=s[i].right; //更新 a 的值 } } printf("%d\n",cnt); } return 0; }
相关文章推荐
- org.json.simple使用详解
- Week3---9月25日 表格
- Java基础知识强化57:经典排序之希尔排序(ShellSort)
- 标准IO库函数 ssanf和sprintf
- 浅析APP安全现状,爱加密为APP提供加固方案!
- Uber中国融资规模增至25亿美元 死磕滴滴快的
- Maximum Product Subarray
- 关于栈上的单体结构
- Java操作PDF之itext入门
- iOS---XCode7 + IOS9 问题及解决方案
- Java - What is difference between Enumeration and Iterator?
- JavaScript的DOM编程--08--复习
- intent
- 通过DBMS_SCHEDULER.SET_ATTRIBUTE可以指定执行任务的具体实例
- 公钥与私钥
- 关于指针的三个容易弄混淆的概念及发散
- equals与==的区别。
- 安卓Build中的makefile调用流程
- 日志框架Nlog之将日志输出到文件
- javascript之查找数组中最小/最大的数