您的位置:首页 > 其它

poj 3069 Saruman's Army (贪心)

2015-08-07 12:40 295 查看
简单贪心。

从左边开始,找 r 以内最大距离的点,再在该点的右侧找到该点能覆盖的点。如图。



自己的逻辑有些混乱,最后还是参考书上代码。(《挑战程序设计》 P46)

/******************************************
Problem: 3069		User:
Memory: 668K		Time: 16MS
Language: G++		Result: Accepted
******************************************/
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

int a[1005];

int main()
{
int r, n, i;
while (scanf("%d%d", &r, &n) == 2) {
if (r == -1) break;
for (i = 0; i < n; ++i)
scanf("%d", &a[i]);
sort(a, a + n);
int ans;
ans = i = 0;
while(i < n) {
int s = a[i++];				// s is the first point uncovered
while (i < n && a[i] <= s + r) ++i;		// s can cover range
int p = a[i - 1];			// p should be covered
while (i < n && a[i] <= p + r) ++i;		// p can cover range
++ans;						// the point is p
}
printf("%d\n", ans);
}
return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: