题目信息
emmm,还是北湖深坑,不用惊喜,不用意外
我们继续用石头填!
北湖的地面依旧是一维的,每一块宽度都为1,高度是非负整数,用一个数组来表示。
还是提供不限量的 1 乘號 2 规格的石头。
但是这一次是 DarkDawn 来填坑,他有很强烈的强迫症,所有的石头只能水平摆放(宽为2,高为1)。
问这样是否可以将北湖填平。(所有地面到达同一高度即为填平)
输入
样例有多组输入至文件末尾;
每组用例占两行;
第一行输入1个整数 n (1 ≤ n ≤ 2*10^5)
表示北湖地面总宽度;
第二行输入 n 个整数 a ( 0 ≤ a ≤ 1e9)
,用空格间隔,表示地面高度。
输出
若能填平则输出“YES”,否则输出“NO”。
测试样例
5
2 1 1 2 5
3
4 5 3
3
1 2 3
YES
NO
NO
解答
#include <cstring>
#include <iostream>
#include <stack>
#define ll long long
using namespace std;
int main()
{
//ios::sync_with_stdio(false);
//freopen("E://test.txt", "r", stdin);
//freopen("E://out.txt", "w", stdout);
int T;
while (scanf("%d", &T) != EOF)
{
int MAX = 0;
int num[1000000];
for (int i = 0; i < T; i++)
{
scanf("%lld", &num[i]);
if (num[i] >= MAX)
{
MAX = num[i];
}
}
stack<ll> s;
int op = 0;
for (int i = 0; i < T; i++)
{
if (s.empty())
{
s.push(num[i]);
}
else if (num[i] > s.top())
{
op = 1;
}
else if (num[i] == s.top())
{
s.pop();
}
else
{
s.push(num[i]);
}
}
if (op == 1)
{
printf("NO\n");
}
else if (s.size() == 0)
{
printf("YES\n");
}
else if (s.size() == 1)
{
if (s.top() == MAX)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
else if (s.size() > 1)
{
printf("NO\n");
}
}
return 0;
}
本题目的前序题目如下:
填坑Ⅰ