Build Stairs

该文章介绍了一个编程题目,涉及正方形高度调整,判断是否可通过操作保持高度非递减。通过C++代码实现逻辑判断,输出可行或不可行的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述

有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

逻辑解析

  1. 输入:首先程序从标准输入读取正方形的数量n,然后读取n个正方形的高度,存储在数组a中。

  2. 预处理:程序通过数组b保存每个正方形高度减少1后的值,即b[i] = a[i] - 1

  3. 遍历和判断:程序从第二个正方形开始遍历(因为第一个正方形的高度无需比较,直接作为初始c值)。对于每个正方形,它比较当前c值(代表前一个正方形操作后的高度)与当前正方形的高度a[i]和高度减少1后的值b[i]

    • 如果c小于等于b[i],则无需对第i个正方形进行任何操作,因为即使不操作也满足不递减的条件。
    • 如果c小于a[i]但大于b[i],则需要对第i个正方形的高度进行减少1的操作,以使得高度不递减。
    • 如果c大于等于a[i],则无法通过任何操作使得正方形的高度从左到右不递减,输出"No"并结束程序。
  4. 输出:如果遍历完所有正方形都没有输出"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; // 程序正常结束  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值