UESTC - 1523 递推规律题

正如地球上有三种性别的人(男、女、秀吉),需要三种厕所。EX星也是,这里有n个性别,每个性别对应一个厕所,性别i对应厕所i。

现在所有的n种厕所按1、2、3……n的顺序围成一个(每种一个),每个厕所都有一个人(保证n个性别的人都正好有一个),每个厕所只能一个人用,有些人上对了厕所,有些人上错了厕所。

你的任务是让每个人都上对厕所,你只可以交换相邻厕所(i号厕所和i+1号、1号和n号)位置的人,问题是你最少需要进行多少次这样的操作。

保证最多只有3个人上错厕所。

Input

第一行一个整数 n(1n233) n(1≤n≤233),表示厕所个数。接下来一行有n个整数表示第i号厕所的人的性别。

Output

每组数据输出一行表示最少操作数。

Sample Input
1
1
  
  
4 4 2 3 1
5 2 4 3 1 5
Sample Output
0
  
  
1
4

思路:纸张的厉害;

分情况讨论:error=0 时,0;

error=2 时,两者进行交换,选择顺时针,逆时针两个方向的最小值;

error=3 时,先换出一个正确的位置,此时,就是选择任意进行操作,然后计算出最小步数,3种移动方式,比较出最小值,然后就是error=2的状态了;

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int a[10];

int main()
{
	int n,k,p=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&k);
		if(k!=i)
			a[++p]=i;
	}
	if(p==0)
		printf("0\n");
	else if(p==2)
	{
		int ans=min(a[2]-a[1],n-a[2]+a[1]);
		printf("%d\n",ans*2-1);
	}
	else
	{
		int ans12=min(a[2]-a[1],n-a[2]+a[1]);
		int ans13=min(a[3]-a[1],n-a[3]+a[1]);
		int ans23=min(a[3]-a[2],n-a[3]+a[2]);
		int res1=ans12*2-1+ans13*2-1;
		int res2=ans12*2-1+ans23*2-1;
		int res3=ans23*2-1+ans13*2-1;
		printf("%d\n",min(res1,min(res2,res3)));
	}
	return 0;
} 


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值