POJ3069Saruman's Army(贪心)

本文介绍了一个炮弹覆盖问题的解决方案,通过将点排序并采用贪心策略选择炮弹的最佳安装位置来达到最少数量的炮弹覆盖所有点的目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


题意:给一些点,然后给一些射程为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);
     }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值