POJ-3069-Saruman's Army(Java簡單貪心)

來源:互聯網
上載者:User

標籤:acm   貪心演算法   java   poj   

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);}}}


POJ-3069-Saruman's Army(Java簡單貪心)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.