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

13 篇文章 0 订阅
4 篇文章 0 订阅

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

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

在这里插入图片描述

卡了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个房间) 的时候结束。

我觉得这个思想也可以再让我试试去做做青蛙了…
一会就去试试。
在这里插入图片描述

下面是ac代码:

#include <iostream>

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值