目录
Description
又是北湖深坑,惊不惊喜,意不意外?! R o a r k 觉得用水填湖太没意思了,用石头填坑多有意思。 假设北湖的地面还是一维的,每一块宽度都为1,高度是非负整数,用一个数组来表示。 现提供不限量的 1 乘號 2 规格的石头,问是否可以将北湖填平。(所有地面到达同一高度即为填平) 注:石头只能水平或垂直填放。
Input 样例有多组输入至文件末尾; 每组用例占两行; 第一行输入1个整数 n 空格 左小括號 1 小於等於 n 小於等於 2 乘號 10 的 5 次方 右小括號 表示北湖地面总宽度; 第二行输入 n 个整数 a 下標 i 空格 左小括號 0 小於等於 a 下標 i 小於等於 1 e 9 右小括號 ,用空格间隔,表示地面高度。
Output 若能填平则输出“YES”,否则输出“NO”。
前言
这题是真简单,简单在哪里?
首先用栈,而栈经过前面的题,你已经非常熟悉了。
然后就是题目逻辑,hhh这个也是有现成的题解的。
连看题解带敲代码,15分钟搞定没问题。
题解
代码
博主的代码写的稍微有点啰嗦,而且类型控制的不是太好,用了long long 大概是做出来以后懒得修改了。
其实呢,只要不TLE,无脑long long是没有问题的,可以避免很多溢出的bug。
但是我还是喜欢精细控制的:累加的直接用long long,刷新的,根据范围而定。
#include<cstdio>
#include<stack>
#define WIDTH 200001
int height[WIDTH];
std::stack <int> face;
int main(void)
{
// freopen("input.txt", "r", stdin);
int n, i, max;
while (scanf("%d", &n) != EOF)
{
//初始化,清空
while (!face.empty())
face.pop();
max = 0;
//读入所有值,储存最大值
for (i = 0; i < n; i++)
{
scanf("%d", &height[i]);
if (height[i] > max)
max = height[i];
}
//转化01串
for (i = 0; i < n; i++)
height[i] = (max - height[i]) % 2;
//栈两两相消
for (i = 0; i < n; i++)
{
if (face.empty())//首先搞定空栈情况
face.push(height[i]);
else if (height[i] == face.top()) //然后是相等情况
face.pop();
else //不相等情况
face.push(height[i]);
}
//判断输出
if (face.size() <= 1)//剩下0/1个元素,那么就没问题
puts("YES");
else
puts("NO");
}
}