POJ NO.3069 Saruman's Army(经典贪心)
2016-02-03 15:29
162 查看
问题描述:
直线上有N个点。点 i 的位置是Xi。从这N个点中选择若干个,给它们加上标记。对每一个点,其距离为R以内的区域里必须有带有标记的点(自身带有标记的点,可可以认为与其距离为0的地方有一个带有标记的点)。让你求至要标记多少个点。
题目链接:点击打开链接
思路:
从最左端开始,我们找到距离这个点R以内的最右端的点。如此循环...
代码:
直线上有N个点。点 i 的位置是Xi。从这N个点中选择若干个,给它们加上标记。对每一个点,其距离为R以内的区域里必须有带有标记的点(自身带有标记的点,可可以认为与其距离为0的地方有一个带有标记的点)。让你求至要标记多少个点。
题目链接:点击打开链接
思路:
从最左端开始,我们找到距离这个点R以内的最右端的点。如此循环...
代码:
#include<iostream> #include<cstdio> #include<cmath> #include<queue> #include<cstring> #include<algorithm> #define INF 0x3f3f3f3f #define MAX 1010 using namespace std; int main() { int arr[MAX], N, R; while(~scanf("%d%d", &R, &N)){ if(N == -1 && R == -1) break; int ans = 0; for(int i = 0; i < N; i++) cin >> arr[i]; sort(arr, arr + N); int j = 0; while(j < N){ //a是没有被覆盖的点 int a = arr[j++]; while(j < N && arr[j] <= a + R) j++; //b是被标记的点 int b = arr[j - 1]; //一直向右找,直到找到距离b大于R的点 while(j < N && arr[j] <= b + R) j++; ans++; } cout << ans << endl; } return 0; }
相关文章推荐
- HDU3635(并查集)
- ubuntu14.04上VLC编译问题
- Spring中的IoC(控制反转)具体是什么东西
- C#如何定义全局变量
- 文件压缩工具类
- JAVA中关于链表的操作和基本算法
- Office365 New Admin Portal Preview
- Fragment源码分析(一) 构造
- C++学习之多态篇(异常处理)
- Windows玩转Docker(一):安装
- SCHEMA学习二--指示器
- springMVC导入excel案例poi
- 2407: 探险 dijkstra 思路题
- 大题---打印回型嵌套
- oracle实例与数据库
- BZOJ 3437: 小P的牧场 斜率优化dp
- mkdir 命令
- hdoj--2255--奔小康赚大钱(KM算法模板)
- 基于Spring + Spring MVC + Mybatis 高性能web构建
- SVG图形绘制与滤镜