ACM_程序设计竞赛:贪心算法:saruman army

/* saruman's army 给从左边开始,在圆内的最右边的点加上标记即可。 */

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

#define MAX_N 1000

int r, n;
int x[MAX_N];

void solve()
{
    sort(x,x+n);

    int i=0,ans=0;
    while(i<n) //s是没有被覆盖的最左边的位置
    {
        int s=x[i++];
        //向右前进到距s距离大于r的点

        while(i<n && x[i]<=s+r)
            i++;

        //p是新加的标记的点的位置
        int p= x[i-1];

        //一直向右前进到距p的距离大于r的点
        while(i<n && x[i] <= p+r)
            i++;

        ans++;
    }

    cout<<ans<<endl;
}

int main()
{
    while(cin>>n>>r)
    {
        for(int i=0;i<n;i++)
            cin>>x[i];
        if (r == -1 && n == -1) break;
        else solve();
    }
    return 0;
}

你可能感兴趣的:(ACM_程序设计竞赛:贪心算法:saruman army)