(File IO): input:laundry.in output:laundry.out
时间限制: 3000 ms 空间限制: 128001 KB 具体限制
Goto ProblemSet
题目描述
奶牛们用
N
(
1
<
=
N
<
=
1000
)
N(1<=N<=1000)
N(1<=N<=1000)根绳子架起了晾衣绳,以便晒它们刚洗完的衣服。用它们不能弯曲的拇指,奶牛们彻底搞砸了这项工作。试想一下四根绳子是这样排列的:
绳子交叉了!这个,当然是无法接受的。
奶牛们想把晾衣绳整理好。它们迟钝的头脑只能处理"交换两根绳"的问题。然而奶牛们的手臂(牛的……也叫手臂)很短,受此限制,它们只能交换相邻两根绳子的端点(在上面或者是下边的固定器上)。以上面的图为例,需要做四次这样的交换才能使绳子变成想下面这样:
帮助奶牛们整理晾衣绳吧。请你找出最小的交换次数,使得这些晾衣绳能够排列整齐。
你将得到有关晾衣绳位置的描述,用整数来表示当前晾衣绳的顺序。这些晾衣绳被标上了
1..
N
1..N
1..N的数字。现在可以告诉你的是,这些晾衣绳在上面和下面各
N
N
N个连接插槽上的出现顺序。
输入
第
1
1
1行:一个整数N
第
2..
N
+
1
2..N+1
2..N+1行:每一行有两个隔开的整数(均在
1..
N
1..N
1..N范围内)。第一个整数表示在上插槽上连接的绳子的
I
D
ID
ID,第二个整数表示在下插槽上连接的绳子的
I
D
ID
ID。第二行的两个整数就分别表示了
1
1
1号上插槽和1号下插槽上连接的绳子;第三行则分别描述了
2
2
2号上插槽和下插槽上连接的绳子……以此类推。
输出
第
1
1
1行:一个整数,指出可以把晾衣绳全都弄直的最小交换次数
样例输入
4
4 1
2 3
1 4
3 2
样例输出
4
数据范围限制
1<=N<=1000
提示
样例说明:
把
3
3
3号绳上面的端点和它左边的交换,再和左边的交换一次。
4
4
4号绳也做同样的工作。
解题思路
初始:
我们要让
a
[
1
]
=
b
[
1
]
a[1]=b[1]
a[1]=b[1],所以让
a
[
1
]
a[1]
a[1]与所有在他右边的交换。。
我们要让
a
[
2
]
=
b
[
2
]
a[2]=b[2]
a[2]=b[2],所以让
a
[
2
]
a[2]
a[2]与所有在他右边的交换。。
我们要让
a
[
3
]
=
b
[
3
]
a[3]=b[3]
a[3]=b[3],所以让
a
[
3
]
a[3]
a[3]与在他右边的交换。。
!!!!!搞定
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
int n,a[1010],b[1010],ans;
int main()
{
freopen("laundry.in","r",stdin);
freopen("laundry.out","w",stdout);
cin>>n;
for(int i=1; i<=n; i++)
scanf("%d%d",&a[i],&b[i]);
for(int i=1; i<=n; i++) {
if(a[i]!=b[i])
{
for(int j=i; j<=n; j++)
{
if(a[j]==b[i]) {
int t=a[i];
for(int k=j; k>i; k--) {
a[k]=a[k-1];
ans++;
}
a[i]=t;
break;
}
}
}
int t=1;
for(int j=1; j<=n; j++)
{
if(a[j]!=b[j]) {
t=0;
break;
}
}
if(t==1)
break;
}
cout<<ans<<endl;
}