POJ 3069 Saruman's Army

    xiaoxiao2021-03-25  83

    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

    Solutions

    1. 先将点集从小到大排序。 2. 找到第i个点,点亮离它最远的(在R的范围内)的一个点,并在此基础上找到在R范围内的下一个点,这个点就是下一次循环中的i,以此循环,直到遍历完全。

    Source Code

    #include<iostream> #include<algorithm> using namespace std; int main() { int r, n; cin >> r; int i; while (r != -1) { cin >> n; int num = 0; int p[1001]; for (i = 0; i < n; i++) { cin >> p[i]; } sort(p, p + n); i = 0; while (i < n) { int now = p[i++]; while (i < n && p[i] <= r + now) { i++; } now = p[i - 1]; while (i < n && p[i] <= r + now) { i++; } num++; } cout << num << endl; cin >> r; } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-34538.html

    最新回复(0)