Bootstrap

C++建楼梯贪心算法

问题描述

有𝑁个正方形从左到右排成一行。第𝑖个正方形的高度是𝐻𝑖。 对于每个正方形,你可以执行以下操作之一:

• 将正方形的高度减少1。

• 什么也不做。

 确定是否可以通过执行这些操作使得正方形的高度从左到右非递减。

限制条件

• 输入中的所有值均为整数。

• 1≤𝑁≤1e5

• 1≤𝐻𝑖≤1e9

输入 输入以以下格式从标准输入中给出:      N H1 H2 H3 …… Hn                                                  

输出 如果可以通过执行操作使得正方形的高度从左到右非递减,则输出Yes;否则输出No。

样例

输入  5   1 2 1 1 3      输出   Yes

输入  4   1 3 2 1          输出   No

思路:它通过遍历每个正方形的高度,并维护一个当前遇到的最大高度max。对于每个新的高度H,如果H大于max,则更新max;如果H小于max-1,则说明无法通过减少1的操作使得正方形的高度从左到右非递减,因此输出No并结束程序。如果遍历完所有正方形都没有出现这种情况,则输出Yes。

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int main()
{
	ios::sync_with_stdio(false);//关闭同步 
	cin.tie(nullptr); //取消cin 和 cout的绑定 
	ll n;
	cin>>n;
	vector<int> arr(n);
	ll max;
	cin>>arr[0];
	max=arr[0];
	for(int i=1;i<n;i++)
	{
		cin >> arr[i];
		if(arr[i] > max)  
		max=arr[i];
		else if(arr[i] < max - 1)  
		{
			cout<< "No"<< endl;
			return 0;	
		}
	}
	cout<< "Yes" << endl;
	return 0;
}

;