您的位置:首页 > 其它

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: