题意:给一些点,然后给一些射程为r的炮弹,问最少需要几个点上安装这种炮弹能覆盖这些点。
思路:先把点排序,然后从第一个点开始找炮弹安装的位置,这个位置当然是覆盖越多的点越好,所以尽量把炮弹安装在 左面和右面都有点的地方(也就是某一些点的中间),这样贪心可以达到局部最优解,从而达到全局最优解。
例子:
r = 10 n = 7
1 7 15 20 30 50 70
第一法炮弹肯定按在 7那里比较好,因为这样左面可以覆盖到1,右面可以覆盖到15, 如果安装在1 或者 15 上就要2发炮弹。
第二发炮弹放在30 ,左面能打到20
第三发放在 50
第四发放在 70
代码:
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1005;
int a[maxn];
int main()
{
int r,n;
while(~scanf("%d%d",&r,&n))
{
if(r == -1 && n == -1)
break;
for(int i = 1;i <= n;++i)
scanf("%d",&a[i]);
sort(a + 1,a + n + 1);
a[0] = 0;
int ans = 0;
int now = 1;
int start = 1;
for(;start <= n;)
{
while(now <= n && a[now] - a[start] <= r) now++;
if(a[now] - a[now - 1] <= r)start = now - 1;
while(now <= n && a[now] - a[start] <= r)now++;
start = now;
ans++;
}
printf("%d\n",ans);
}
}