Codeforces Round #259 (Div. 2)-B. Little Pony and Sort by Shift

来源:互联网 发布:ie8 js serialize 编辑:程序博客网 时间:2024/06/05 20:29
B. Little Pony and Sort by Shift
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

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:

a1, a2, ..., an → an, a1, a2, ..., an - 1.

Help Twilight Sparkle to calculate: what is the minimum number of operations that she needs to sort the sequence?

Input

The first line contains an integer n (2 ≤ n ≤ 105). The second line contains n integer numbers a1, a2, ..., an (1 ≤ ai ≤ 105).

Output

If it's impossible to sort the sequence output -1. Otherwise output the minimum number of operations Twilight Sparkle needs to sort it.

Sample test(s)
input
22 1
output
1
input
31 3 2
output
-1
input
21 2
output
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;} 


0 0
原创粉丝点击