CodeForces - 1066B Heaters (贪心,区间覆盖,index

贪心策略我感觉最不擅长了…想不到好的方法,以前做的青蛙跳,做的挺崩溃的。

实不相瞒, 这道题我想了好几节课呐,纲要的时候想,大学语文的时候想,回宿舍想…
其实我的思路并不清晰,那些所谓的想都是无用功。看别人的题解,因为乱七八糟的解法还有我以前写的冗长并且没用的代码,让我很浮躁…看不下去,导致这道题迟迟 a 不出来…

CodeForces - 1066B Heaters (贪心,区间覆盖,index_第1张图片

卡了18天,昨天终于做出来了。还是看到某位大佬的简短的代码,不仅让我卧槽一声,竟然还可以这样!!??

我不知道这是什么思想,但是我感觉发现了一条新世界的大门…

下面就谈一谈这种思维,希望能用我自己的语言表述出来。并在以后遇到类似的问题也能使用,虽然我不知道这个类似的问题具体是什么样的…

题意就是开最少的加热器,让房间变得温暖。
从第一个房间开始遍历,设cur表示现在要加热的房间。cur = 1。表示第一个房间需要加热。

关键的地方来了:
设置一个索引 index,让它等0,等-1,或者其他小于0的数,甚至是小数,只要不代表房间号都可以。因为其作用就是一个标记作用,这里我让index为0.
然后从第一个房间开始遍历,找加热器,如果能加热到现在要加热的房间,索引就更新为这个加热器的位置。直到遍历完所有的房间,那么index就是能加热到这个房间最远的加热器。
然后判断一下,如果index = 0,说明遍历了所有的房间都没有找到一个加热器可以加热到cur这个房间。所以就输出-1然后return即可。
如果 index != 0,答案数+1,然后cur更新为这个加热器能加热到最远的位置,即 cur = index + r
(这里的cur是没被加热到的)
直到 cur > n(最多n个房间) 的时候结束。

我觉得这个思想也可以再让我试试去做做青蛙了…
一会就去试试。
CodeForces - 1066B Heaters (贪心,区间覆盖,index_第2张图片

下面是ac代码:

#include 

using namespace std;

int h[1020];

int main()
{

    int n, r;
    cin >> n >> r;
    for(int i = 1; i <= n; ++i)
        cin >> h[i];

    int cur = 1, res = 0;

    while(cur <= n){

        int index = 0;

        for(int i = 1; i <= n; ++i)
            if(h[i])
                if(cur >= i-r+1 && cur <= i+r-1)
                    index = i;

        if(index == 0){
            cout << -1 << endl;
            return 0;
        }

        res++;
        cur = index + r;
    }
    cout << res << endl;

    return 0;
}

你可能感兴趣的:(思维,贪心,Codeforces)