题目链接:http://codeforces.com/contest/1092/problem/D2
题意:现在有一堵墙,它高度参差不齐,给出每一个单位的高度,现在你需要修复它,你有无限块 2 ∗ 1 2∗1 2∗1的砖头,你只能横放,问你能否可以将它修补到同一高度。
解题心得:首先要明白,墙目前只能是凹形往上升。例如321123,不能是123321。可以直接用一个栈,如果栈顶元素高度小于当前的高度,那么直接输出NO,如果栈顶元素高度和当前高度相同,这个时候栈顶元素弹出,如果栈顶高度大于当前高度,直接将当前高度压入。如果最后栈内元素数量大于2个直接输出NO,如果只有一个但不是墙的最大高度输出NO。说起来十分复杂其实看代码就能懂。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn = 2e5+100;
int n;
int main() {
// freopen("1.in.txt", "r", stdin);
scanf("%d", &n);
stack <int> st;
int Max = 1;
for(int i=1;i<=n;i++) {
int temp; scanf("%d", &temp);
Max = max(Max, temp);
if(st.empty()) {
st.push(temp);
} else {
if(st.top() < temp) {
printf("NO");
return 0;
} else if(st.top() == temp) {
st.pop();
} else {
st.push(temp);
}
}
}
if(st.size() == 1 && st.top() != Max) {
printf("NO");
return 0;
}
if(st.size() > 1) printf("NO");
else printf("YES");
return 0;
}