poj 3069 Saruman's Army 【贪心】
2015-10-06 00:19
295 查看
[align=center]Saruman's Army[/align]
Description
Saruman the White must lead his army along a straight path from Isengard to Helm’s Deep. To keep track of his forces, Saruman distributes seeing stones, known as palantirs, among the troops. Each palantir has a maximum effective range of
R units, and must be carried by some troop in the army (i.e., palantirs are not allowed to “free float” in mid-air). Help Saruman take control of Middle Earth by determining the minimum number of palantirs needed for Saruman to ensure that each of
his minions is within R units of some palantir.
Input
The input test file will contain multiple cases. Each test case begins with a single line containing an integer
R, the maximum effective range of all palantirs (where 0 ≤ R ≤ 1000), and an integer
n, the number of troops in Saruman’s army (where 1 ≤ n ≤ 1000). The next line contains n integers, indicating the positions
x1, …, xn of each troop (where 0 ≤ xi ≤ 1000). The end-of-file is marked by a test case with
R = n = −1.
Output
For each test case, print a single integer indicating the minimum number of palantirs needed.
Sample Input
Sample Output
Hint
In the first test case, Saruman may place a palantir at positions 10 and 20. Here, note that a single palantir with range 0 can cover both of the troops at position 20.
In the second test case, Saruman can place palantirs at position 7 (covering troops at 1, 7, and 15), position 20 (covering positions 20 and 30), position 50, and position 70. Here, note that palantirs must be distributed among troops and are not allowed
to “free float.” Thus, Saruman cannot place a palantir at position 60 to cover the troops at positions 50 and 70.
Source
Stanford Local 2006
思路:
先将输入的坐标进行排序,然后从左往右找一个半径为R的圆的圆心(也就是第一个循环),然后找终点,找到终点也就是下次循环的起点,一直这样循环,知道终点的下标大于等于n为止!
代码:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 5770 | Accepted: 2952 |
Saruman the White must lead his army along a straight path from Isengard to Helm’s Deep. To keep track of his forces, Saruman distributes seeing stones, known as palantirs, among the troops. Each palantir has a maximum effective range of
R units, and must be carried by some troop in the army (i.e., palantirs are not allowed to “free float” in mid-air). Help Saruman take control of Middle Earth by determining the minimum number of palantirs needed for Saruman to ensure that each of
his minions is within R units of some palantir.
Input
The input test file will contain multiple cases. Each test case begins with a single line containing an integer
R, the maximum effective range of all palantirs (where 0 ≤ R ≤ 1000), and an integer
n, the number of troops in Saruman’s army (where 1 ≤ n ≤ 1000). The next line contains n integers, indicating the positions
x1, …, xn of each troop (where 0 ≤ xi ≤ 1000). The end-of-file is marked by a test case with
R = n = −1.
Output
For each test case, print a single integer indicating the minimum number of palantirs needed.
Sample Input
0 3 10 20 20 10 7 70 30 1 7 15 20 50 -1 -1
Sample Output
2 4
Hint
In the first test case, Saruman may place a palantir at positions 10 and 20. Here, note that a single palantir with range 0 can cover both of the troops at position 20.
In the second test case, Saruman can place palantirs at position 7 (covering troops at 1, 7, and 15), position 20 (covering positions 20 and 30), position 50, and position 70. Here, note that palantirs must be distributed among troops and are not allowed
to “free float.” Thus, Saruman cannot place a palantir at position 60 to cover the troops at positions 50 and 70.
Source
Stanford Local 2006
思路:
先将输入的坐标进行排序,然后从左往右找一个半径为R的圆的圆心(也就是第一个循环),然后找终点,找到终点也就是下次循环的起点,一直这样循环,知道终点的下标大于等于n为止!
代码:
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int r,n; int a[1005]; int main() { while(scanf("%d%d",&r,&n)&&(r!=-1||n!=-1)) { for(int i=0;i<n;i++) { scanf("%d",&a[i]); } sort(a,a+n);//坐标从小到大排序 int i=0,cnt=0;//i用来保存最左边的下标 while(i<n) { int s=a[i++];//s用来保存还没有被包围的第一个点的坐标 while(i<n&&a[i]<=s+r) i++;//用来找要标记的点 int p=a[i-1]; while(i<n&&a[i]<=p+r) i++;//用来找最末尾的点,也就是下一个点的起点 cnt++;//标记的点的个数 } printf("%d\n",cnt); } return 0; }
相关文章推荐
- PHP
- 例题 8-2 和为0的4个值 UVa 1152
- debian网关不同子网的设定
- Web_JavaScript_JS循环滚动效果;
- 12 Integer to Roman
- 二维码扫描-zbar的使用
- 关于Socket的经验小结
- Log4j官方文档翻译(七、日志格式化)
- linux C 编程基础-多文件工程编程框架
- c++ vector实验
- 隔日随笔样式测试
- 第一次自己去做一个程序,而不是照着书本上的代码打程序。
- 浮点型JAVA008
- 让Ubuntu更多的使用物理内存
- HttpURLConnection的get和post处理方法(含图片)
- Codeforces Round #323 D Once Again...
- 带你玩转Visual Studio——带你多工程开发
- 例题5.23 蚂蚁 LA4043
- HDOJ 5366 The mook jong(规律)
- Linux编程学习之路_1