2020寒假【gmoj1875】【晾衣绳】

题目描述

奶牛们用N(1<=N<=1000)根绳子架起了晾衣绳,以便晒它们刚洗完的衣服。用它们不能弯曲的拇指,奶牛们彻底搞砸了这项工作。试想一下四根绳子是这样排列的:
在这里插入图片描述
绳子交叉了!这个,当然是无法接受的。

奶牛们想把晾衣绳整理好。它们迟钝的头脑只能处理"交换两根绳"的问题。然而奶牛们的手臂(牛的……也叫手臂)很短,受此限制,它们只能交换相邻两根绳子的端点(在上面或者是下边的固定器上)。以上面的图为例,需要做四次这样的交换才能使绳子变成想下面这样:
在这里插入图片描述
帮助奶牛们整理晾衣绳吧。请你找出最小的交换次数,使得这些晾衣绳能够排列整齐。

你将得到有关晾衣绳位置的描述,用整数来表示当前晾衣绳的顺序。这些晾衣绳被标上了1…N的数字。现在可以告诉你的是,这些晾衣绳在上面和下面各N个连接插槽上的出现顺序。

输入

第1行:一个整数N

第2…N+1行:

每一行有两个隔开的整数(均在1…N范围内)。第一个整数表示在上插槽上连接的绳子的ID,第二个整数表示在下插槽上连接的绳子的ID。第二行的两个整数就分别表示了1号上插槽和1号下插槽上连接的绳子;第三行则分别描述了2号上插槽和下插槽上连接的绳子……以此类推。

输出

一个整数,指出可以把晾衣绳全都弄直的最小交换次数

样例输入

4
4 1
2 3
1 4
3 2

样例输出

4

分析

这题其实很神奇,题目描述有点坑。
我同样用了一个很神奇的方法。根据样例,可以生成一个序列:3 4 1 2。为什么呢?
样例中:
左边第个数4,在右边的位置是3,序列第一个放3;
左边第个数2,在右边的位置是4,序列第二个放4;
以此类推……
得到序列之后做一个冒泡(选择)排序。记录交换次数。交换次数就是答案。

上代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,u[1001],d[1001],ans,a[1001];
int main()
{
    freopen("laundry.in","r",stdin);
    freopen("laundry.out","w",stdout);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
    	scanf("%d%d",&u[i],&d[i]);
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(u[i]==d[j])
			{
				a[i]=j;
			}
		}
	}
	for(int i=1;i<=n-1;i++)
	{
		for(int j=i+1;j<=n;j++)
		{
			if(a[i]>a[j])
			{
				swap(a[i],a[j]);
				ans++;
			 } 
		}
	}
	cout<<ans;
    fclose(stdin);
    fclose(stdout);
    return 0;
}

发布了63 篇原创文章 · 获赞 61 · 访问量 5446

猜你喜欢

转载自blog.csdn.net/dglyr/article/details/104329679