ACM题集:https://blog.csdn.net/weixin_39778570/article/details/83187443
题目链接:http://poj.org/problem?id=3069
题意:
n个军人,定义设备的监控范围为R,设备被携带在军人身上,问最少有多少个设备能监控所有人
题解
每个设备就是一个区间,问最少要有多少个区间才能把点覆盖完
每次选择能覆盖到左边的最远的点,以这个点为中心放置一个设备,寻找设备能覆盖到的最远的点,以下一个点左为新区间左端点
#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
#define fo(i,j,n) for(register int i=j; i<=n; ++i)
using namespace std;
const int maxn = 1005;
int n,R,a[maxn];
void solve(){
sort(a+1,a+1+n);
int pos=1,now,ans=0;
while(pos<=n){
ans++;
now = a[pos]; // 左边第一个奴隶
while(pos<=n && a[pos]<=now+R) pos++;// 从左往右找到一个左覆盖不到的
now = a[--pos]; // 中,监控器所在的奴隶的位置
while(pos<=n && a[pos]<=now+R) pos++;// 从左往右找到一个右覆盖不到的
}
cout<<ans<<endl;
}
int main(){
while(scanf("%d%d",&R,&n) && (R!=-1&&n!=-1)){
fo(i,1,n)scanf("%d",&a[i]);
solve();
}
return 0;
}