POJ 3069 Saruman's Army(贪心)

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);
    }
}

你可能感兴趣的:(POJ 3069 Saruman's Army(贪心))