填坑Ⅱ | C++ | 栈

一、题目描述

Description

北湖的地面是一维的,每一块宽度都为1,高度是非负整数,用一个数组来表示。

提供不限量的 1 × 2 规格的石头。

所有的石头只能水平摆放(宽为2,高为1)。

问这样是否可以将北湖填平。(所有地面到达同一高度即为填平)

Input
样例有多组输入至文件末尾;

每组用例占两行;

第一行输入1个整数 n (1 ≤ n ≤ 2×1e5 )表示北湖地面总宽度;

第二行输入 n 个整数 a( 0 ≤ a ≤ 1e9 ) ,用空格间隔,表示地面高度。

Output
若能填平则输出“YES”,否则输出“NO”。

测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. 5↵
  2. 2 1 1 2 5↵
  3. 3↵
  4. 4 5 3↵
  5. 3↵
  6. 1 2 3↵
以文本方式显示
  1. YES↵
  2. NO↵
  3. NO↵
1秒64M0

二、思路分析

        呃,和填坑Ⅰ大差不差吧,稍作修改就可以了。

        主要的改动如下:

        ①填坑Ⅰ是相差偶数就可以出栈,现在要相等才可以出栈。

        ②注意一些特殊的情况。

        特殊情况1:栈内剩下一个元素,但它不是最大值。

         后面四个都出栈,最后只剩下第一列。然而,第一列需要被填平,却不能被填平。

        特殊情况2:入栈的时候,出现了待入栈元素大于栈顶元素的情况。

        如果还用上一题的方法, 最后3和4出栈,2和5出栈,1和6出栈,栈内不剩元素。但也不能被填平。 


三、代码实现

int highest = 0 , flag = 1;
//当待入栈元素大于栈顶元素时,令flag=0,之后不管读入什么数字,都一定输出NO

//总共有n个高
for (int i=0;i<n;i++) {
	scanf( "%d" , &h );
	if ( flag == 1 ) {

		if ( highest < h ) highest = h;
		
        if ( ( stack.size()>0 ) && ( h==stack.top() ) ) {
				stack.pop();
		}

		else if ( ( stack.size()>0 ) && ( h>stack.top() ) ) {
			flag = 0;
		}

		else {
			st.push(h);
		} 

	}
}

        最后合适地输出即可。


四、完整代码

#include<bits/stdc++.h> 
using namespace std;
const int N = 2 * 1e5;
int height[N];
struct Stack {
	int front = 0;
	void push(int h) {
		if (front + 1 < N) {
			height[ front ] = h;
			front++;
		}
	}
	
	void pop() {
		if ( front > 0 ) front--;
	}
	
	int top() {
		if ( front > 0 ) return height[ front-1 ];
	}
	
	int size() {
		return front;
	}
};
 
int main(){
	
	int n,h;
	while ( scanf("%d",&n) != EOF ) {
		
		int highest = 0 , flag = 1;
		Stack st;
		for (int i=0;i<n;i++) {
			scanf("%d",&h);
			if (flag==1) {
				if (highest<h) highest=h;
				if ( ( st.size()>0 ) && ( h==st.top() ) ) {
					st.pop();
				}
				else if ( ( st.size()>0 ) && ( h>st.top() ) ) {
					 flag = 0;
				}
				else {
					st.push(h);
				} 
			}
		}
		
		if (flag==1) {
			if ( st.size()<=1 ) {
				if ( st.size()==0 ) printf("YES\n");
				else if (st.top()==highest) printf("YES\n");
				else printf("NO\n");
			}
			else printf("NO\n");
		}
		else printf("NO\n");
		
	}
	 
	return 0;
}

因为我目前设置的都是仅粉丝可见,最近粉丝变多了。提醒大家千万不要完全照抄代码啊!!有查重扣分的!!害人害己!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值