poj 3069 Saruman's Army 贪心

poj原题:

http://poj.org/problem?id=3069

大致题意
给定多组数据,每组数据中有一个范围x,及n个点及数轴坐标,
请标记某几个点,使得每个点在距离其x内有至少1个被标记的点。
问最少标记几个点可以满足上面的要求。

思路
所以很显然,这是一道(shui shui de)贪心。
第一先排序,这样就是按数轴从左到右的顺序排序。

我们要确定每一个点在标记点的“辐射”范围内。
那么先确保最左边一个a在标记点辐射范围内。
也就是说被第一个被标记的点一定在a+x内;
并且为了最优性,一定是a+x内最大的一个点被标记;
寻找到这个被标记的点后,我们要确定它最多可以覆盖多少个点,
于是继续向右寻找在a+2x内的点直到找到一点无法被覆盖;
那么这个点就是下一个a点,重复上述步骤,直至找遍所有的点。

贴代码=。=

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

int a[1000],n,m,x,ans;

int main()
{
    freopen("in.txt","r",stdin);
    while(1)
    {
        memset(a,0,sizeof(a));
        scanf("%d%d",&m,&n);
        if(n==-1&&m==-1)break;

        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        sort(a+1,a+n+1);

        ans=0;
        for(int i=1;i<=n;i++)
        {
            ans++;
            x=a[i]+m;
            while(a[i+1]<=x)i++;
            x=a[i]+m;
            while(a[i+1]<=x)i++;
        }
        printf("%d\n",ans);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值