洛谷 CF1385C Make It Good
思路:此题我们可以先从样例入手,观察样例中的好的序列,找到好的序列的规律,绘制成如下的图:
1组数据的好的序列:
2组数据的好的序列:
3组数据的好的序列:
4组数据的好的序列:
5组数据的好的序列:
从样例中的以上5幅分析图中,可以看出,好的序列分为几类:
1.数列是有序的(升序降序均可)。
2.呈一个先上升后下降的趋势(类似山峰的形状,或者说也可以有相邻元素出现相等,样例中告诉我们了)。
于是我们可以从后往前扫,打标记,如果当前是降序就打上标记,代表已经不可能再出现升序了,如果出现打上标记并且出现升序了,就退出,然后我们把当前退出的位置-1就是我们要删除的数字前缀了(当然如果序列本身满足也没触碰到退出条件,自然退出,也不用担心出现负数)。
代码
#include<bits/stdc++.h>
using namespace std;
int t,n,a[200001],i;
bool f;
int main(){
cin>>t;
while(t--){
f=false;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=n;i>0;i--){
if(a[i]>a[i-1])
f=true;
if(a[i]<a[i-1]&&f){
i--;
break;
}
}
cout<<i<<endl;
}
return 0;
}