POJ 3069: Saruman's Army

http://poj.org/problem?id=3069

 

贪心算法

每一轮从起点开始,找到中心点,再推算下一轮的起始点

一轮结果加1

 

 1 #include <stdio.h>
 2 #include <algorithm>
 3 
 4 int main()
 5 {
 6     int r;    //半径
 7     int n;    //节点数
 8     while (scanf("%d %d", &r, &n) != EOF)
 9     {
10         if (r == -1 && n == -1)
11             break;
12 
13         int* arr = new int[n];
14         
15         //输入
16         for (int i = 0; i < n; i++)
17             scanf("%d", &arr[i]);
18 
19         //升序排序
20         std::sort(arr, arr + n);
21 
22         //处理
23         int ans = 0;    //结果
24         int idx = 0;    //索引
25         while (idx < n)
26         {
27             //本轮的开始节点
28             int startIdx = idx;
29             idx++;
30 
31             //找能到的最远节点
32             while (idx < n && arr[startIdx] + r >= arr[idx])
33                 idx++;
34 
35             //本轮的中心点
36             int centerIdx = idx - 1;
37 
38             //找下一轮的开始节点
39             while (idx < n && arr[centerIdx] + r >= arr[idx])
40                 idx++;
41 
42             ans++;    //一轮增加一个节点
43         }
44 
45         printf("%d\n", ans);
46 
47 
48         delete[] arr;
49     }
50     return 0;
51 }

 

posted @ 2015-05-06 14:47  iswoit  阅读(114)  评论(0编辑  收藏  举报