cdoj-1523【思维】

题目链接:点击打开链接

我想上厕所
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)

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

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

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

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

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

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

Sample input and output
Sample Input Sample Output
1
1
0
4
4 2 3 1
1
5
2 4 3 1 5
4
Source
第八届ACM趣味程序设计竞赛第二场(正式赛)


思路:

最多三个不一样的:

1)都一样 : 0 

2)两个不一样 : 距离 × 2 - 1 

3)三个不一样 : 找到中间那个错的位置,找到最中间的数对应的正确位置,因为三个位置错的,必定对应其中的一个,而交换后,剩余的两个在做交换即可~每次换后都需要把原来正确位置的数移动回去~所有每次的代价为 距离 × 2 - 1


#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n;
int a[4];
int main()
{
	while(~scanf("%d",&n))
	{
		int num=0;
		for(int i=1;i<=n;i++)
		{
			int x;
			scanf("%d",&x);
			if(i!=x)
				a[++num]=i;
		}
		if(num==0)
			puts("0");
		else if(num==2)
		{
			int ans=min(a[2]-a[1],n-(a[2]-a[1]));
			printf("%d\n",ans*2-1);
		}
		else
		{
			int v12=min(a[2]-a[1],n-(a[2]-a[1]));
			int v13=min(a[3]-a[1],n-(a[3]-a[1]));
			int v23=min(a[3]-a[2],n-(a[3]-a[2]));
			int mid1=v12*2-1+v13*2-1;
			int mid2=v12*2-1+v23*2-1;
			int mid3=v13*2-1+v23*2-1;
			printf("%d\n",min(mid1,min(mid2,mid3)));
		}
	}
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值