题目链接:点击打开链接
题意:只用一种操作:把最后一个数放到最前面来将一个数列变为非递减的,问最少需要多少次这种操作,如不能变成则输出-1
实际就是在数列中找到一个起点(最小值),将起点前的数放到最后面去,如果这个序列不是非递减的就输出-1否则输出起点后面有多少个数。
如果有多个连续的最小值应取第一个为起点
代码:
#include <iostream>
using namespace std;
int x[100010];
int main()
{
int n;
while(cin>>n){
bool flag=0;
int mi=100010;
int a=0;
for(int i=1;i<=n;i++){
cin>>x[i];
if(mi>=x[i]){
mi=x[i];
a=i;
}
}
while(a>1){
if(x[a-1]!=x[a])
break;
a--;
}//多个连续最小值取第一个为起点
int tmp=x[a];
for(int i=a;i<=n;i++){
if(x[i]<tmp){
flag=1;
break;
}
tmp=x[i];
}
for(int i=1;i<a;i++){
if(x[i]<tmp){
flag=1;
break;
}
tmp=x[i];
}
if(flag)
cout<<"-1"<<endl;
else
cout<<(a==1?0:n-a+1)<<endl;
}
return 0;
}