首页 > 代码库 > Codeforces Round #259 (Div. 2) B. Little Pony and Sort by Shift(模拟)

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

题目链接:Codeforces Round #259 (Div. 2)  B. Little Pony and Sort by Shift

求给出的序列最少移动多少次成为非下降序列。移动方式:只能将最后一个元素移到第一个位置 即:a1,?a2,?...,?an?→?an,?a1,?a2,?...,?an?-?1.


从后前开始搜非下降的子序列,然后前面的子序列接在其后面,最后判断变化后的序列是否是非下降序列即可。

AC代码:

#include<stdio.h>
#include<string.h>

int main()
{
	int n,j;
	int a[100010];
	int i,b[100010];

	while(scanf("%d",&n)!=EOF)
	{
		memset(b,0,sizeof b);
		for(i=1;i<=n;i++)
			scanf("%d",&a[i]);
		int x=-1,cnt=0;
		for(i=n;i>=1;i--)
		{
			if(a[i]<a[i-1])
			{
				x=i;
				break;
			}
		}
		if(x==-1)
		{
			printf("0\n");
			continue;
		}
		for(i=x,j=0;i<=n;i++,j++)
			b[j]=a[i];
		for(i=1;i<x;i++,j++)
			b[j]=a[i];
		int mark=0;
		for(i=1;i<n;i++)
		{
			if(b[i]<b[i-1])
			{
				mark=1;
				break;
			}
		}
		if(mark==1)
			printf("%d\n",-1);
		else
			printf("%d\n",n-x+1);
	}

return 0;
}