J描述
JM自从学习了约瑟夫问题,就特别感兴趣,研究了很久。设计了一个类似的游戏,取名叫做冷嘲热讽。
总共有NN个人参与游戏,一字排开,从左往右编号1,2,...,N1,2,...,N,每一个人初始有一个能力值A_iAi。
每一轮,每一个人同时向嘲讽右边的人,如果被嘲讽的能力值比嘲讽的人大(A_i < A_{i + 1}Ai<Ai+1),则被嘲讽的人淘汰出局。
一轮结束,没被淘汰的人向左靠齐,调整站位,重新编号1,2,...,1,2,...,,进入下一轮。
当不再会有人被淘汰时,游戏结束。
现在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^41≤N≤104;
50\%50%的数据,满足 1≤N≤10^51≤N≤105;
100\%100%的数据,满足1≤N≤10^6, 0≤Ai≤10^91≤N≤106,0≤Ai≤109.
#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\n",ans);
return 0;
}
来源:oschina
链接:https://my.oschina.net/u/4408675/blog/3235750