一、题目描述
Description
北湖的地面是一维的,每一块宽度都为1,高度是非负整数,用一个数组来表示。
提供不限量的 1 × 2 规格的石头。
所有的石头只能水平摆放(宽为2,高为1)。
问这样是否可以将北湖填平。(所有地面到达同一高度即为填平)
Input
样例有多组输入至文件末尾;每组用例占两行;
第一行输入1个整数 n (1 ≤ n ≤ 2×1e5 )表示北湖地面总宽度;
第二行输入 n 个整数 a( 0 ≤ a ≤ 1e9 ) ,用空格间隔,表示地面高度。
Output
若能填平则输出“YES”,否则输出“NO”。
测试输入 期待的输出 时间限制 内存限制 额外进程 测试用例 1 以文本方式显示
- 5↵
- 2 1 1 2 5↵
- 3↵
- 4 5 3↵
- 3↵
- 1 2 3↵
以文本方式显示
- YES↵
- NO↵
- NO↵
1秒 64M 0
二、思路分析
呃,和填坑Ⅰ大差不差吧,稍作修改就可以了。
主要的改动如下:
①填坑Ⅰ是相差偶数就可以出栈,现在要相等才可以出栈。
②注意一些特殊的情况。
特殊情况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;
}
因为我目前设置的都是仅粉丝可见,最近粉丝变多了。提醒大家千万不要完全照抄代码啊!!有查重扣分的!!害人害己!