您的位置:首页 > 其它

B - Little Pony and Sort by Shift

2016-09-22 23:04 627 查看
Submit Status Practice CodeForces
454B

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:

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 Input

Input
2
2 1


Output
1


Input
3
1 3 2


Output
-1


Input
2
1 2


Output

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-1111a6
]>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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: