POJ 3069 Saruman's Army(贪心)

本文介绍了一种在给定点集和半径R的情况下,通过排序和中心选择策略,找出最少标记点数量的方法,确保所有点都位于标记点左右不超过R的区间内。算法通过逐步增加标记点覆盖范围,实现最优解。适用于数据筛选和空间覆盖等场景。

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

Description
这个题是说给你n个点,然后让你标记其中尽可能少的点,使得n个点都处于被标记点左右不超过R的区间内
Input
多组用例,每组用例第一行两个整数R和n,第二行n个整数表示n个点的位置,以-1 -1结束输入
Output
对于每组用例,输出标记点的最少数量
Sample Input
0 3
10 20 20
10 7
70 30 1 7 15 20 50
-1 -1
Sample Output
2
4
Solution
先排序,从小到大,以最小的x为中心,找到距离x+r范围内最右的点,再以该点为中心向右,这样找到的是第一个圆圈所能包含的最多的点,以此类推
Code

#include<stdio.h>
int main()
{
    int r,n,x[1001],i,j,k,t,count,s,p;
    scanf("%d%d",&r,&n);
    while(r!=-1&&n!=-1)
    {
        count=0;
        for(i=0;i<n;i++)
            scanf("%d",&x[i]);      
        for(i=0;i<n-1;i++)//对点排序 
        {
            k=i; 
            for(j=i+1;j<n;j++)
                if(x[k]>x[j])
                    k=j;
            if(k!=i)
            {
                t=x[i];
                x[i]=x[k];
                x[k]=t;
            } 
        } 
        i=0;
        while(i<n)
        {
            s=x[i++];
            while(i<n&&x[i]<=(s+r)) 
                i++;
            p=x[i-1];
            while(i<n&&x[i]<=(p+r))
                i++;
            count++;
        }
        printf("%d\n",count);
        scanf("%d%d",&r,&n);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值