Description
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?
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 Input
2 2 1
1
3 1 3 2
-1
2 1 2
0
这道题觉得非常水,但却一直wa,在训练赛的最后12提交过。。汗颜
思路:先将数组复制一遍放在接在数组后面,找到数组中最小的那个数在数组中出现的第一个位置,然后只要从他开始有连续的n个递增(前后相等也可),就可以。。。
第一次的代码:(思路比较智障)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[100005];
int main()
{
int x;
while(cin>>x)
{
int max=0,t,t1,max1=0;
for(int i=0; i<x; i++)
{
scanf("%d",&a[i]);
if(a[i]>max)
{
max=a[i];
t=i;
}
if(a[i]>=max1)
{
max1=a[i];
t1=i;
}
}
for(int i=t;i<x;i++)
{
if(a[i]!=max)
break;
else
{
t=i;
}
}
int flag1=0,flag2=0,flag3=0,flag4=0;
for(int i=1;i<t1;i++)
{
if(a[i-1]>a[i])
flag1=1;
}
for(int i=t1+2;i<x;i++)
{
if(a[i-1]>a[i])
flag2=1;
}
for(int i=1;i<t;i++)
{
if(a[i-1]>a[i])
flag3=1;
}
for(int i=t+2;i<x;i++)
{
if(a[i-1]>a[i])
flag4=1;
}
if(flag1==0&&flag2==0&&(a[x-1]<=a[0]||t1==x-1))
printf("%d\n",x-1-t1);
else
{
if(flag3==0&&flag4==0&&(a[x-1]<=a[0]||t==0))
printf("%d\n",x-1-t);
else
printf("-1\n");
}
}
return 0;
}