One day, Twilight Sparkle is interested in how to sort a sequence of integers a1, a2, ..., an in non-decreasing order. Being a young unicorn, the only operation she can perform is a unit shift. That is, she can move the last element of the sequence to its beginning:
Help Twilight Sparkle to calculate: what is the minimum number of operations that she needs to sort the sequence?
The first line contains an integer n (2 ≤ n ≤ 105). The second line contains n integer numbers a1, a2, ..., an (1 ≤ ai ≤ 105).
If it's impossible to sort the sequence output -1. Otherwise output the minimum number of operations Twilight Sparkle needs to sort it.
2 2 1
1
3 1 3 2
-1
2 1 2
0
思路:昨天晚上做,模拟的超时, 今天再一想其实只需要记录不是非降子序列的次数(cnt) 当 cnt==0 就输出0; 当 cnt=1 && a[n-1]<a[0]时输出次数 其他输出-1 以下附上超时代码和AC代码
/*ILE*/ #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> using namespace std; int a[100006*3]; int b[100006]; int cmp(const void *a,const void *b){ return *(int *)b-*(int *)a; } int main(){ int n; int i,j; int k; while(scanf("%d",&n)!=EOF){ int flag,flag1=0; int cnt=0; for(i=n-1;i>=0;i--){ scanf("%d",&a[i]); b[i]=a[i]; } qsort(b,n,sizeof(b[0]),cmp); // for(i=0;i<n;i++) // cout<<b[i]<<" "; // cout<<endl; flag=0; for(i=0;i<n;i++){ if(a[i]!=b[i]){ flag=1; break; } } if(!flag) printf("0\n"); else{ cnt=0; for(i=0;i<n;i++){ a[n]=a[0]; for(j=0;j<n;j++) a[j]=a[j+1]; // for(j=0;j<n;j++) // cout<<a[j]<<" "; // cout<<endl; flag1=0; for(j=0;j<n;j++){ if(a[j]!=b[j]){ flag1=1; break; } } if(flag1) cnt++; } //printf("cnt=%d\n",cnt); if(cnt>=n){ printf("-1\n"); }else printf("%d\n",cnt); } } return 0; }
/*AC*/ #include <iostream> #include <cstdio> #include <cstring> using namespace std; int a[100006]; int main(){ int i,n,cnt,k; while(scanf("%d",&n)!=EOF){ for(i=1;i<=n;i++) scanf("%d",&a[i]); cnt=0; k=1; for(i=2;i<=n;i++){ if(a[i]<a[i-1]){ cnt++; k=i; } } if(cnt==0) printf("0\n"); else if(cnt==1&&a[n]<=a[1]){ printf("%d\n",n+1-k); }else{ printf("-1\n"); } } return 0; }