2021-2022-1 ACM集训队每周程序设计竞赛 - 问题 C: 我的世界- 题解

Posted Tisfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-2022-1 ACM集训队每周程序设计竞赛 - 问题 C: 我的世界- 题解相关的知识,希望对你有一定的参考价值。


我的世界

时间限制:1秒
空间限制:256M


题目描述

小T我的世界中建立了 N N N根柱子,其中第 i i i根柱子由 H i H_i Hi个方块组成。

一次操作的定义是:去掉某根柱子的一个方块

小T对一根柱子最多进行一次操作,问能否找到一种方法,使得 N N N根柱子从左到右含有的方块数量非递减

例如本来有 5 5 5根柱子,高度分别是 1 1 1 2 2 2 1 1 1 1 1 1 3 3 3
可以选择对第二根柱子进行一次操作(减少第二根柱子中的一个方块)
之后所有柱子所包含的方块数为 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3,非递减。


输入描述

输入包括 2 2 2
第一行是 1 1 1个整数 N N N,代表我的世界中共有 N N N根柱子
第二行是 N N N个空格隔开的正整数 H i H_i Hi,代表从左到右每根柱子所包含的方块数
数据范围:

  • 1 ≤ N ≤ 1 0 5 1\\leq N\\leq 10^5 1N105
  • 1 ≤ H i ≤ 1 0 9 1\\leq H_i\\leq 10^9 1Hi109

输出描述

能否找到一种方法,在对一根柱子顶多操作一次的前提下,使得这 N N N根柱子所包含的方块数量非递减。
如果可以,输出YES,否则输出No


样例一

输入

4
1 3 2 1

输出

No

题目分析

每个柱子都有一定的方块数,要想让柱子从左到右方块数一次增加,就需要从左到右,在这个柱子的方块数不少于前一个的前提下,使得这个柱子的方块数量尽可能地少。(通俗地说,就是使左边柱子的方块数量尽可能少)

首先左边第一个柱子,方块数越少越好,因此第一个柱子就直接进行一次操作

之后从第二个柱子开始向右遍历所有的柱子,遍历到这个柱子时,如果这个柱子方块儿仍比前一个多,就直接No(前面一个柱子的方块数已经达到最小值)。

否则,如果这个柱子的方块比上一个多,就可以减少一个(减少后仍不少于前一个柱子)

但如果这个柱子的方块数量和上一个已经一样多了,那么这个柱子就不能再减少方块数量了。

如果遍历到最后也没有输出No,就输出Yes即可。


AC代码

#include <bits/stdc++.h>
using namespace std;

int a[100010];
int main() 
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) 
        scanf("%d", &a[i]);
    
    a[0]--;
    for (int i = 1; i < n; i++) 
        if (a[i] < a[i - 1]) 
            puts("No");
            return 0;
        
        if (a[i] > a[i - 1]) 
            a[i]--;
        
    
    puts("Yes");
    return 0;

原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/121551291

以上是关于2021-2022-1 ACM集训队每周程序设计竞赛 - 问题 C: 我的世界- 题解的主要内容,如果未能解决你的问题,请参考以下文章

BUCT - 2021-2022-1 ACM集训队每周程序设计竞赛(10)题解

BUCT - 2021-2022-1 ACM集训队每周程序设计竞赛题解

BUCT - 2021-2022-1 ACM集训队每周程序设计竞赛题解

BUCT - 2021-2022-1 ACM集训队每周程序设计竞赛题解

2021-2022-1 ACM集训队每周程序设计竞赛题解

2021-2022-1 ACM集训队每周程序设计竞赛题解