Description
emmm,还是北湖深坑,不用惊喜,不用意外 我们继续用石头填! 北湖的地面依旧是一维的,每一块宽度都为1,高度是非负整数,用一个数组来表示。 还是提供不限量的 1 乘號 2 规格的石头。 但是这一次是 D a r k D a w n 来填坑,他有很强烈的强迫症,所有的石头只能水平摆放(宽为2,高为1)。 问这样是否可以将北湖填平。(所有地面到达同一高度即为填平)
Input 样例有多组输入至文件末尾; 每组用例占两行; 第一行输入1个整数 n 空格 左小括號 1 小於等於 n 小於等於 2 乘號 10 的 5 次方 右小括號 表示北湖地面总宽度; 第二行输入 n 个整数 a 下標 i 空格 左小括號 0 小於等於 a 下標 i 小於等於 1 e 9 右小括號 ,用空格间隔,表示地面高度。
Output 若能填平则输出“YES”,否则输出“NO”。
前言
这题其实从思路上来说,要比18要好想出来,18的01串转化其实自己想不是很容易想出来(额,其实知道高度不限也很好想出来,要是限制高度才阴间,额,不过因为最高点已知,其实也不会阴间hhh)
如果在18速成的情况下做,是比18要稍微难一点,毕竟有一个凹坑的考虑。
有题解,一切ok!
题解
代码
大概是我们的风格略有不同,我总觉得他有点啰嗦,不过其实差别不大
#include<cstdio>
#include<stack>
#define WIDTH 200001
int height[WIDTH];
std::stack<int> face;
int main(void)
{
// freopen("input.txt", "r", stdin);
int n, max, i;
while (scanf("%d", &n) != EOF)
{
//初始化
max = 0;
while (!face.empty())
face.pop();
//读入
for (i = 0; i < n; i++)
{
scanf("%d", &height[i]);
if (height[i] > max)
max = height[i];
}
//匹配
for (i = 0; i < n; i++)
{
if (!face.empty() && height[i] == face.top())//抵消,至于高度后面讨论
face.pop();
else
{
if (!face.empty() && height[i] > face.top())//如果后面高,会缺角
break;
else //空的或者是后面低,还有机会
face.push(height[i]);
}
}
//判断
if (face.size() == 0)
puts("YES");
else if (face.size() == 1 && face.top() == max)
puts("YES");
else
puts("NO");
}
}