Saruman‘s Army
Time Limit: 1000MS |
|
Memory Limit: 65536K |
Total Submissions: 4699 |
|
Accepted: 2430 |
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 310 20 2010 770 30 1 7 15 20 50-1 -1 Sample Output 24 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
首先解釋一下題目(博主英文渣!)(翻譯出自《挑戰程式設計競賽》):直線上有N個點。點i的位置是Xi。從這N個點中選擇若干個,給它們加上標記。對每一個點,其距離為R以內的地區裡必須有帶有標記的點(自己本身帶有標記的點,可以認為與其距離為0的地方有一個帶有標記的點)。在滿足這個條件的情況下,希望能為儘可能少的點委任標記。請問至少要有多少點被加上標記? 限制條件:1. 1<=N<=10002. 0<=R<=10003. 0<=Xi<=1000 範例: 輸入:R=10 N=6X={1,7,15,20,30,50} 輸出:3
/* * 從最左邊的點開始考慮,對於這個點,到距R以內的地區內必須要有帶有標記的點。 * 此點位於最左邊,顯然帶有標記的點一定在此點右側!所以從最左邊的點開始,距離 * 為R以內的最遠的點,對於添加了符號的點右側超過R的下一個點,可以把這個點看作 * 第一次最左邊的那個點,因為這兩個點是等價的,即採用同樣的方法即可! */import java.io.*;import java.util.*;public class Main{public static void main(String[] args){// TODO Auto-generated method stubScanner input = new Scanner(System.in);while (input.hasNext()){int R = input.nextInt();int N = input.nextInt();int X[] = new int[N];for (int i = 0; i < N; i++){X[i] = input.nextInt();}Arrays.sort(X);int i = 0, ans = 0;while (i < N){int s = X[i++];// 一直向右前進直到距s的距離大於R的點while (i < N && X[i] <= s + R)i++;// p是新加上標記的點的位置int p = X[i - 1];// 一直向右前進直到距p的距離大於R的點while (i < N && X[i] <= p + R)i++;ans++;}System.out.println(ans);}}}
|