版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Flynn_curry/article/details/62237877
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[N];
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;
}