J描述
JM自从学习了约瑟夫问题,就特别感兴趣,研究了很久。设计了一个类似的游戏,取名叫做冷嘲热讽。
总共有N个人参与游戏,一字排开,从左往右编号1,2,...,N,每一个人初始有一个能力值Ai。
每一轮,每一个人同时向嘲讽右边的人,如果被嘲讽的能力值比嘲讽的人大(Ai<Ai+1),则被嘲讽的人淘汰出局。
一轮结束,没被淘汰的人向左靠齐,调整站位,重新编号1,2,...,,进入下一轮。
当不再会有人被淘汰时,游戏结束。
现在JM想知道,这个游戏要多少轮才会结束。你能帮帮他吗?
输入
第一行输入1个整数N,表示总共有N个人参加游戏。
第二行N个整数Ai。
输出
一个整数,表示游戏要多少轮才会结束。
样例
输入
复制
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%的数据,满足1≤N≤104;
50%的数据,满足 1≤N≤105;
100%的数据,满足1≤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 ",ans); return 0; }