蓝桥杯模拟赛5 附J题代码

J描述

JM自从学习了约瑟夫问题,就特别感兴趣,研究了很久。设计了一个类似的游戏,取名叫做冷嘲热讽。

总共有NN个人参与游戏,一字排开,从左往右编号1,2,...,N12...N,每一个人初始有一个能力值A_iAi

每一轮,每一个人同时向嘲讽右边的人,如果被嘲讽的能力值比嘲讽的人大(A_i < A_{i + 1}Ai<Ai+1),则被嘲讽的人淘汰出局。

一轮结束,没被淘汰的人向左靠齐,调整站位,重新编号1,2,...,12...,进入下一轮。

当不再会有人被淘汰时,游戏结束。

现在JM想知道,这个游戏要多少轮才会结束。你能帮帮他吗?

输入

第一行输入11个整数NN,表示总共有NN个人参加游戏。

第二行NN个整数A_iAi

输出

一个整数,表示游戏要多少轮才会结束。

样例

输入

复制

 

7
6 5 8 4 7 10 9

输出

复制

 

2

输入

复制

 

5
2 4 6 8 3

输出

复制

 

2

输入

复制

 

3
3 2 1

输出

复制

 

0

提示

样例1解释

初始状态:6 5 8 4 7 10 9

第一轮:6 5 4 9

第二轮:6 5 4

样例2解释

初始状态:2 4 6 8 3

第一轮:2 3

第二轮:2

数据规模

30\%30%的数据,满足1≤N≤10^41N104;

50\%50%的数据,满足 1≤N≤10^51N105;

100\%100%的数据,满足1≤N≤10^6, 0≤Ai≤10^91N106,0Ai109.

#include<iostream>
using std::max;
const int N=1e6+5;
int n,a[N],s[N],q[N],top,ans;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",a+i);
    for(int i=1;i<=n;i++){
        int cnt=0;
        for(;top&&s[top]>=a[i];top--) cnt=max(cnt,q[top]);
        if(!top) cnt=-1;cnt++;
        s[++top]=a[i];
        q[top]=cnt;
        ans=max(ans,cnt);
    }
    printf("%d
",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/shenben/p/12699244.html