nyoj891找点
2015-10-10 20:56
141 查看
贪心策略就是 把所有区间按b从小到大排序(当b相同时,排不排序都可以),则如果出现区间包含的情况,小区间一定排在前面。第一个区间取最后一个点。
/* 找点 时间限制: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 */ #include <stdio.h> #include <stdlib.h> struct Qu { int x; int y; }s[100]; int cmp(const void *a,const void *b) { Qu *c=(Qu *)a; Qu *d=(Qu *)b; if(c->y!=d->y) return c->y-d->y; else return c->x-d->x; } int main() { int n; while(~scanf("%d",&n)) { int i; for(i=0;i<n;i++) scanf("%d%d",&s[i].x,&s[i].y); qsort(s,n,sizeof(s[0]),cmp); int m,l=1; m=s[0].y;//m作为其他与之比较的标记点,其代表着标记区间的右边界 for(i=1;i<n;i++) { if(s[i].x<=m)//下一个区间的左边界若是比标记区间的右边界小 则不需加点 不用改变标记点 continue; else if(s[i].x>m)//下一个区间的左边界若是比标记区间的右边界大 则代表需添加标记点 此时改变标记点的位置 { l=l+1; m=s[i].y; } } printf("%d\n",l); } return 0; }
相关文章推荐
- 递归的一些经典应用
- 一个常见的错误时编写代码
- Validform 学习笔记---基础知识整理
- Android笔记---使用ViewFlipper组件实现文本上下滑动效果
- HDU 4819 二维线段树
- Android 项目(详解三)—— 数据库类
- 初识UML
- Fiddler手机抓包
- drawable—hdpi、drawable—mdpi、drawable—ldpi详解
- 在多线程环境中使用CoreData
- web 代码规范
- 启动datanode后jps下无datanode的解决方法
- 0-1背包模板
- 黑马程序员—Foundation框架之NSFileManager、NSNumber与NSDate
- coreData 深入理解4 --总结 (线程安全与同步--iOS5 前后对比)
- ufldl 深度学习入门 第5发 线性解码器
- configure文件的生成
- UML——活动图、状态图
- Android-ContentProvide
- 问题解决 sql server 2008 评估期已过期解决办法