poj3069 Saruman's Army(经典贪心)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Flynn_curry/article/details/62237877


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

题意:给出范围R,被标记的点可以覆盖范围内的点,求用多少个点就可以完全覆盖所有点。


思路:这道题真的泪奔了。没看书上的思路,先是看见有重复元素去重,贪心策略还给选错了,麻烦了好多。。还特判了起点的情况,结果以为过了样例就沾沾自喜,无限WA,真的是彻底错了。

首先是贪心策略的选择,范围是两边的啊。。说不清,刚开始也不知道自己怎么的就选成了一边。。

接着是模拟,基本都是挑战上的模拟方法,我想说我根本没想到好伐。不知道怎么表达,就是觉得他这种方法太精辟了,没一点拖泥带水。。

只有我觉得这是道好题吗。。


#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <queue>
#include <iostream>

using namespace std;

typedef long long ll;
const int N = 1005;
const int INF = 0x3f3f3f3f;

int main()
{
  //  freopen("in.txt", "r", stdin);
    int dis[N];
    int R, n;
    while(~scanf("%d%d", &R, &n))
    {
        if(R==-1 && n==-1) break;
        for(int i = 0; i < n; i++)
            scanf("%d", &dis[i]);
        sort(dis, dis+n);
        int i = 0, left, mid, ans = 0;
        while(i < n)
        {
            left = dis[i++];//顺便把i变成下一个点下标,直接判断下一个,代表范围的起点
            while(i<n && dis[i]<=left+R) i++;//跳出循环后i为超出范围点的下标
            mid = dis[i-1];//选择被标记点
            while(i<n && dis[i]<=mid+R) i++;//同样是找出超出范围点下标,下一次循环就在这个超出点,也就是另一个范围了!
            ans++;
        }
        printf("%d\n", ans);
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/Flynn_curry/article/details/62237877