POJ 3069 Saruman's Army(贪心)
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
0 3 10 20 20 10 7 70 30 1 7 15 20 50 -1 -1
Sample Output
2 4
尽量使每个球覆盖的位置最大。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <algorithm> 6 #include <cctype> 7 #include <cmath> 8 #include <queue> 9 #include <map> 10 #include <cstdlib> 11 using namespace std; 12 13 int main(void) 14 { 15 int r,n; 16 int s[1005]; 17 int ans,left,i,mid; 18 19 while(scanf("%d%d",&r,&n) && (r != -1 && n != -1)) 20 { 21 for(i = 0;i < n;i ++) 22 scanf("%d",&s[i]); 23 sort(s,s + n); 24 25 ans = i = 0; 26 while(i < n) 27 { 28 left = s[i ++]; 29 for(;i < n && s[i] - left <= r;i ++); 30 left = s[i - 1]; 31 ans ++; 32 for(;i < n && s[i] - left <= r;i ++); 33 } 34 printf("%d\n",ans); 35 } 36 37 return 0; 38 }