POJ 3069 Saruman's Army(贪心、思维)

  开始不再状态,没看下去题目,题意没了解,再看也没看懂,深刻认识到理解题意重要性!!

  以后每次写题解都会写题目大意,毕竟人们做容易忘记最重要、最基础的。

  题目大意:给你n个据点,让你建立哨点,让每个哨兵的控制范围在r内,而且用最少的哨点控制所有据点。

  思路:

  要确定每一个哨点:先说第一个哨点,哨点必须能够控制第一个据点,它的控制范围和下一个哨点的控制范围必须要能将第二个据点覆盖。

  然后类推,每个哨点和  前一个哨点   和  后一个哨点必须将先相应的据点控制,这个题目是考察思维的,虽然也有点贪心的意思

核心代码:

while(i<n)
        {
            int up=a[i++];
            //向右查询符合控制范围的哨点
            while(i<n&&a[i]<=up+r)
                i++;
            int newup=a[i-1];
            //从这个哨点找它对下一个的控制范围
            while(i<n&&a[i]<=newup+r)
                i++;
            ans++;//成功建立哨点
        }
完整代码:

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int r,n,a[1005];
    while(cin>>r>>n&&(r!=-1||n!=-1))
    {
        for(int i=0;i<n;i++)
            cin>>a[i];
            sort(a,a+n);
        int i=0,ans=0;//用来计数符合条件的哨点
        while(i<n)
        {
            int up=a[i++];
            //向右查询符合控制范围的哨点
            while(i<n&&a[i]<=up+r)
                i++;
            int newup=a[i-1];
            //从这个哨点找它对下一个的控制范围
            while(i<n&&a[i]<=newup+r)
                i++;
            ans++;//成功建立哨点
        }
        cout<<ans<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值