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 1≤N≤105
- 1 ≤ H i ≤ 1 0 9 1\\leq H_i\\leq 10^9 1≤Hi≤109
输出描述
能否找到一种方法,在对一根柱子顶多操作一次的前提下,使得这
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集训队每周程序设计竞赛题解