CodeForces 319B 栈
2015-11-06 20:40
330 查看
//题意:给你长度为n的序列ss
只要ss[i]>ss[i+1] ss[i]就可以吃掉ss[i+1]
//hint里的样例很明白了 [10 9 7 8 6 5 3 4 2 1] → [10 8 4] → [10].
//方法就是利用栈模拟o(n)的效率求出每个元素第几次被吃掉,然后取最大值即可
// main.c
// example
//
// Created by Adam on 15/2/2.
// Copyright (c) 2015年 Adam. All rights reserved.
//
#include <iostream>
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "algorithm"
#include <queue>
#include <stack>
#define N 1800000
#define LL long long int
using namespace
std;
struct node {
int data;
int step;
};
int main()
{
int n;
int ss[100005];
stack <struct
node> que2;
while(scanf("%d",&n)!=EOF)
{
while( !que2.empty() ) que2.pop();
//清空栈
for( int i=0; i<n; i++)
scanf("%d", &ss[i]);
int i=0;
while( i<(n-1) && ss[i]<=ss[i+1] ) i++;//找到第一个入栈的元素
就是第一个可以吃别人的元素
node tmp;
tmp.data = ss[i++]; tmp.step =
0;
que2.push(tmp);//将其入栈
int ans=0,sm;
for( ;i<n; i++ )
{
node p=que2.top();
if(ss[i]<p.data)
//如果当前的元素小于栈顶元素
tmp.data = ss[i] , tmp.step =
1;
else{//否则找到下一个吃它的人的下一个位置
sm = 0;
while( !que2.empty() )
{
tmp = que2.top();
if( tmp.data < ss[i] ) {
sm = max(sm,tmp.step);
//找到step的最大值
que2.pop();
}
else
break;
}
tmp.data = ss[i];
if( que2.empty() ) tmp.step=0;
//如果找不到 step置为0
else tmp.step = sm+1;//如果找到了
step为中间被吃的各个元素的step的最大值
}
que2.push( tmp );//入栈
ans=max( ans,tmp.step );
//取最大step
}
printf("%d\n",ans);
}
return
0;
}
只要ss[i]>ss[i+1] ss[i]就可以吃掉ss[i+1]
//hint里的样例很明白了 [10 9 7 8 6 5 3 4 2 1] → [10 8 4] → [10].
//方法就是利用栈模拟o(n)的效率求出每个元素第几次被吃掉,然后取最大值即可
// main.c
// example
//
// Created by Adam on 15/2/2.
// Copyright (c) 2015年 Adam. All rights reserved.
//
#include <iostream>
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "algorithm"
#include <queue>
#include <stack>
#define N 1800000
#define LL long long int
using namespace
std;
struct node {
int data;
int step;
};
int main()
{
int n;
int ss[100005];
stack <struct
node> que2;
while(scanf("%d",&n)!=EOF)
{
while( !que2.empty() ) que2.pop();
//清空栈
for( int i=0; i<n; i++)
scanf("%d", &ss[i]);
int i=0;
while( i<(n-1) && ss[i]<=ss[i+1] ) i++;//找到第一个入栈的元素
就是第一个可以吃别人的元素
node tmp;
tmp.data = ss[i++]; tmp.step =
0;
que2.push(tmp);//将其入栈
int ans=0,sm;
for( ;i<n; i++ )
{
node p=que2.top();
if(ss[i]<p.data)
//如果当前的元素小于栈顶元素
tmp.data = ss[i] , tmp.step =
1;
else{//否则找到下一个吃它的人的下一个位置
sm = 0;
while( !que2.empty() )
{
tmp = que2.top();
if( tmp.data < ss[i] ) {
sm = max(sm,tmp.step);
//找到step的最大值
que2.pop();
}
else
break;
}
tmp.data = ss[i];
if( que2.empty() ) tmp.step=0;
//如果找不到 step置为0
else tmp.step = sm+1;//如果找到了
step为中间被吃的各个元素的step的最大值
}
que2.push( tmp );//入栈
ans=max( ans,tmp.step );
//取最大step
}
printf("%d\n",ans);
}
return
0;
}
相关文章推荐
- hdu2033
- 快速排序的简单实现(Quick_Sort)
- 静态编联与动态编联总结
- SpringMVC 学习系列 (7) 之 格式化显示
- codeforces Searching for Graph
- 如何发表高水平论文 (转载)
- 快速排序的简单实现(Quick_Sort)
- Java Axis2 1.6.3+JDK1.7.0_13+Tomcat7.0.65+eclipse搭建web service
- SpringMVC 学习系列 (6) 之 数据验证
- 你必须知道的.NET之特性和属性
- KMP模板
- 关于手机屏幕信息的获取
- 13 Roman to Integer
- SpringMVC 学习系列 (5) 之 数据绑定 -2
- Kinect+Unity之手势识别初探
- C#实现插入排序算法(Insection Sort)
- RelativeLayout属性
- ul li span addClass removeClass
- swift 2.0 语法 函数
- swift 2.0 语法 字符串