描述
有N个正方形,从左到右排成一行。从左边起第i个正方形的高是Hi。
对于每个正方形,你都要进行一次下面的运算:
- 将正方形的高度减少 1。
- 不做任何操作。
确定是否有可能进行操作,使正方形的高度从左到右不递减。
输入描述
N
H1 H2 ... HN
输出描述
如果可以执行操作,使方格的高度从左到右不递减,则打印 “是”;否则打印 “否”。
用例输入 1
5 1 2 1 1 3
用例输出 1
Yes
用例输入 2
4 1 3 2 1
用例输出 2
No
用例输入 3
5 1 2 3 4 5
用例输出 3
Yes
用例输入 4
1 1000000000
用例输出 4
Yes
提示
样本输出 1
只需将左起第二个方格的高度减少 1,即可实现目标。
限制因素
- 所有输入值均为整数。
- 1≤N≤105
- 1≤Hi≤109
逻辑解析
-
输入:首先程序从标准输入读取正方形的数量
n
,然后读取n
个正方形的高度,存储在数组a
中。 -
预处理:程序通过数组
b
保存每个正方形高度减少1后的值,即b[i] = a[i] - 1
。 -
遍历和判断:程序从第二个正方形开始遍历(因为第一个正方形的高度无需比较,直接作为初始
c
值)。对于每个正方形,它比较当前c
值(代表前一个正方形操作后的高度)与当前正方形的高度a[i]
和高度减少1后的值b[i]
。- 如果
c
小于等于b[i]
,则无需对第i
个正方形进行任何操作,因为即使不操作也满足不递减的条件。 - 如果
c
小于a[i]
但大于b[i]
,则需要对第i
个正方形的高度进行减少1的操作,以使得高度不递减。 - 如果
c
大于等于a[i]
,则无法通过任何操作使得正方形的高度从左到右不递减,输出"No"并结束程序。
- 如果
-
输出:如果遍历完所有正方形都没有输出"No",则说明存在一种操作方式使得正方形的高度从左到右不递减,输出"Yes"。
代码
#include<bits/stdc++.h> // 引入标准库的头文件,包括输入输出流、数组、算法等
using namespace std; // 使用标准命名空间,这样在后续代码中可以直接使用标准库中的函数和对象,而不需要加std::前缀
const int N = 100007; // 定义常量N,表示正方形的最大数量
int n, c; // 定义整数n和c,其中n表示正方形的数量,c用来记录操作后的高度,初始值未定义
int a[N], b[N]; // 定义两个整数数组a和b,a用来存储原始高度,b用来存储操作一次后的高度
int main() // 主函数
{
cin >> n; // 从标准输入读取正方形的数量
for(int i = 1; i <= n; i++) // 循环读取每个正方形的高度
{
cin >> a[i]; // 读取第i个正方形的高度并存储在数组a中
b[i] = a[i] - 1; // 计算第i个正方形高度减少1后的值,并存储在数组b中
}
c = a[1]; // 初始化c为第一个正方形的高度,作为后续比较的基准
for(int i = 2; i <= n; i++) // 从第二个正方形开始遍历
{
if(c <= b[i]) // 如果当前c小于等于第i个正方形高度减少1后的值
{
c = b[i]; // 更新c为b[i],即选择不进行任何操作
}
else if(c < a[i]) // 如果当前c小于第i个正方形的高度但大于其减少1后的值
{
c = a[i]; // 更新c为a[i],即选择将第i个正方形的高度减少1
}
else // 如果当前c大于等于第i个正方形的高度
{
cout << "No" << endl; // 输出"No",表示无法通过操作使正方形的高度从左到右不递减
return 0; // 结束程序
}
}
cout << "Yes" << endl; // 如果所有正方形都遍历完毕且未输出"No",则输出"Yes",表示可以通过操作实现目标
return 0; // 程序正常结束
}