您的位置:首页 > 其它

poj3069 Saruman's Army(经典贪心)

2017-03-15 21:24 363 查看
http://poj.org/problem?id=3069

题意:给出范围R,被标记的点可以覆盖范围内的点,求用多少个点就可以完全覆盖所有点。

思路:这道题真的泪奔了。没看书上的思路,先是看见有重复元素去重,贪心策略还给选错了,麻烦了好多。。还特判了起点的情况,结果以为过了样例就沾沾自喜,无限WA,真的是彻底错了。

首先是贪心策略的选择,范围是两边的啊。。说不清,刚开始也不知道自己怎么的就选成了一边。。

接着是模拟,基本都是挑战上的模拟方法,我想说我根本没想到好伐。不知道怎么表达,就是觉得他这种方法太精辟了,没一点拖泥带水。。

只有我觉得这是道好题吗。。

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <queue>
#include <iostream>

using namespace std;

typedef long long ll;
const int N = 1005;
const int INF = 0x3f3f3f3f;

int main()
{
// freopen("in.txt", "r", stdin);
int dis
;
int R, n;
while(~scanf("%d%d", &R, &n))
{
if(R==-1 && n==-1) break;
for(int i = 0; i < n; i++)
scanf("%d", &dis[i]);
sort(dis, dis+n);
int i = 0, left, mid, ans = 0;
while(i < n)
{
left = dis[i++];//顺便把i变成下一个点下标,直接判断下一个,代表范围的起点
while(i<n && dis[i]<=left+R) i++;//跳出循环后i为超出范围点的下标
mid = dis[i-1];//选择被标记点
while(i<n && dis[i]<=mid+R) i++;//同样是找出超出范围点下标,下一次循环就在这个超出点,也就是另一个范围了!
ans++;
}
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj