填坑Ⅱ | 简单的数据结构

20. 填坑Ⅱ

成绩 10 开启时间 2020年09月17日 星期四 12:00
折扣 0.8 折扣时间 2020年09月24日 星期四 12:00
允许迟交 关闭时间 2020年10月10日 星期六 23:00

Description

emmm,还是北湖深坑,不用惊喜,不用意外。

我们继续用石头填!北湖的地面依旧是一维的,每一块宽度都为1,高度是非负整数,用一个数组来表示。

还是提供不限量的1x2规格的石头。但是这一次是 Dark来填坑,他有很强烈的强迫症,所有的石头只能水平摆放(宽为2,高为1)。问这样是否可以将北湖填平。(所有地面到达同一高度即为填平)

Input

样例有多组输入至文件末尾;

每组用例占两行;

第一行输入1个整数 n表示北湖地面总宽度;

第二行输入 n个整数,用空格间隔,表示地面高度。

Output

若能填平则输出“YES”,否则输出“NO”。

  测试输入 期待的输出 时间限制 内存限制 额外进程
测试用例 1
  1. 5↵
  2. 2 1 1 2 5↵
  3. 3↵
  4. 4 5 3↵
  5. 3↵
  6. 1 2 3↵
  1. YES↵
  2. NO↵
  3. NO↵
1秒 64M 0

        emmmm我总觉得个填坑Ⅱ和Ⅰ反了,但是怎么今年依旧还是这个顺序....相信看懂Ⅰ的朋友这个Ⅱ真的小菜一碟! 

        第一题的传送门,请看懂第一题再来看第二题:填坑Ⅰ | 简单的数据结构

既然不可以以1为底2为高去填,那么与第一题的思路差别就是:

  1. 最后的结果判定为yes的条件:栈最后为空 或 栈内剩余的唯一元素必须是最高点(好好想想这是为啥)
  2. 我们不可以对坑进行预处理(将他们尽可能填到最高处),我们直接讨论之后的情况。情况变得非常简单:入栈的不是01,而是它们本身的高度!

       依次讨论每一个初始高度,如果相邻的同高且两侧都比它们俩低,那么可以消去忽略不计。如果最后序列里有超过一个元素或剩余的唯一元素不是最高点,则输出NO!如果在讨论的过程中,栈顶元素比栈内高,那我们可以不必继续讨论....


你们可以多画一些测试用例来理解如上思路,鸡翅能力有限(两点了,该睡会了)说不太明白,上面都是精华,剩下的就交给大家了~

附上完整ac代码:

#include<cstdio>
#include<cstring>
#include<stack>

using namespace std;

long long int a[200010] = {0};
stack<int> stk;   //定义一个栈

int main() {
    long long int n;

    //当存在输入的时候
    while (scanf("%lld", &n) != EOF) {
        memset(a, 0, sizeof(a[0]));   //将数组初始化为 0
        while (!stk.empty())  //清空栈
            stk.pop();

        long long maxHeight = 0;
        for (long long i = 0; i < n; i++) {
            scanf("%lld", &a[i]);
            //记下最高值
            if (a[i] > maxHeight)
                maxHeight = a[i];
        }

        for (long long i = 0; i < n; i++) {
            if (!stk.empty() && a[i] == stk.top())  //栈非空且可以对应时
                stk.pop();
            else {   //不可以消去
                if (!stk.empty() && stk.top() < a[i])   //如果比前一个高
                    break;
                else
                    stk.push(a[i]);
            }
        }

        long long remainCount = stk.size();
        if (!remainCount)
            printf("YES\n");
        else if (remainCount == 1 && stk.top() == maxHeight)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

End

欢迎关注个人公众号“鸡翅编程”,这里是认真且乖巧的码农一枚,旨在用心写好每一篇文章,平常会把笔记汇总成推送更新~

猜你喜欢

转载自blog.csdn.net/weixin_43787043/article/details/108675898