【第十九题】填坑II(北理工/北京理工大学/程序设计方法与实践/小学期 )

 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!

题解

填坑Ⅱ | 简单的数据结构_贝贝今天AC了吗的博客-CSDN博客

代码

 大概是我们的风格略有不同,我总觉得他有点啰嗦,不过其实差别不大

#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");
	}
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亦梦亦醒乐逍遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值