1 /* 2 题目大意:给你一个序列,不断地将最后边的数值移动到最前边,问最少经过多少次可以变成一个单调递增的序列! 3 如果不能则输出-1。 4 如果该序列按照不断从后向前移动排序成功,那么该序列要么只有一个单调递增的序列, 5 或者有两段单调递增的序列(1..k 和 k+1..n)并且 (k+1...n)中的最大值num[n]<=(1...k)中的最小值num[1] 6 */ 7 #include<iostream> 8 #include<cstdio> 9 using namespace std; 10 int a[100005]; 11 int main(){ 12 int n; 13 while(scanf("%d", &n)!=EOF){ 14 int cnt=0; 15 int cur=0, nt, place=0; 16 for(int i=1; i<=n; ++i){ 17 scanf("%d", &nt); 18 a[i]=nt; 19 if(nt<cur){ 20 ++cnt; 21 place = i; 22 } 23 cur=nt; 24 } 25 if(cnt==0) 26 printf("0\n"); 27 else if(cnt>1) 28 printf("-1\n"); 29 else{ 30 if(a[n] > a[1]) 31 printf("-1\n"); 32 else printf("%d\n", n-place+1); 33 } 34 } 35 return 0; 36 }
本文转自 小眼儿 博客园博客,原文链接:http://www.cnblogs.com/hujunzheng/p/3886453.html,如需转载请自行联系原作者