您的位置:首页 > 其它

poj 3069 Saruman's Army

2017-10-11 08:24 513 查看
题目大意就不说了

方法是:先排序,然后从第一个点开始往右R个长度看看能覆盖多少点,再从最远能覆盖到的点P开始继续往右R个单位长度,这是点P能覆盖的范围,找到所有这些点做标记,就是最少能标记的点

具体实现如下:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int a[100000];
int main()
{
int R,n;
while(scanf("%d%d",&R,&n)!=EOF)
{
if(R == -1 && n == -1)
break;
int ans = 0;
for(int i = 1; i <= n; i ++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+1+n);
int i = 1,r = a[1];
while(i <= n)
{
int l = r + R;
while(a[i] <= l&&i <= n)
{
i++;
}
int  p = a[i-1];
while(a[i] <= p + R && i <= n)
i ++;
r = a[i];
//  cout <<p <<" "<<r<<" "<<i<<endl;
ans++;
}
cout <<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: