D2. Great Vova Wall (Version 2)

l链接

[https://codeforces.com/contest/1092/problem/D2]

题意

和D1一样只是不能竖直放了

分析

水平放的话,就只可能是相邻等时才可以,而且你会发现
只有中间数字小于两边的才可以
比如551122是可以的,15522不可以,你用一个栈保存当前不能改变高度的位置
如果遇到相等的就出栈,具体看代码体会吧

代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,h;
	//freopen("in.txt","r",stdin); 
	while(~scanf("%d",&n)){
		stack<int> stk;
		int ma=0;
		bool flag=1;
		for(int i=0;i<n;i++)
		{
			scanf("%d",&h); ma=max(ma,h);
			if(!stk.empty()){
				if(h>stk.top()){//如果后面的比栈顶大是不可能填平的,前面没有操作余地了
				//而后面的操作只会使得高度不变或者增加 
					flag=0;
				}
				if(stk.top()==h){//相邻的等高度可以变成大于等于当前的高度 
					stk.pop();
				}
				else if(stk.size()>h) stk.push(h);
			}
			else stk.push(h);
		}
		if(stk.size()>1||stk.size()==1&&stk.top()<ma) flag=0;
		//剩下的就是无法改变的高度如果超过两个,无法同时满足剩下的高度
		//或者剩一个,但是高度小于最大的,也是无法使得所有高度一样 
		if(flag) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}
posted @ 2018-12-19 17:30  ChunhaoMo  阅读(261)  评论(3编辑  收藏  举报