poj 3069 Saruman's Army

/** poj 3069 Saruman's Army
* 05.05/2014
*/
#include <cstdio>
#include <string>//for memset
#include <algorithm>


#define MAXN 4000
#define INF 100000000

using namespace std;

int N,R;
int X[MAXN];


void solve()
{    
    int i =0,count = 0;
    while(i < N)
    {
        int s = X[i++];
        while(i < N && X[i] <= s + R)
            i++;
        int p = X[i-1];
        while(i < N && X[i] <= p + R)
            i++;
        count ++;
        
    }
    printf("%d\n",count);
    return;

}
int main()
{    
    while(scanf("%d %d",&R,&N) != EOF)
    {
        if(R==-1&&N==-1)  
            break; 
        for(int i = 0; i < N; i++)
            scanf("%d",&X[i]);
        sort(X,X+N);
        solve();
    }
    return 0;
    
}

题目:

找最少数目的点,使其能在辐射半径内覆盖所有的点。

 

分析:

贪心。从数轴左端到右端,每次找最右的、辐射半径范围内的点。

 

心得:

没什么好说的。注意半径要算2次才是总的辐射范围。

posted @ 2014-05-06 16:33  Difei  阅读(149)  评论(0编辑  收藏  举报