晾衣绳

晾衣绳

题目描述

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

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

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

输入

第1行:一个整数N

第2…N+1行:

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

输出

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

样例输入

4

4 1

2 3

1 4

3 2

样例输出

4

数据范围限制

1<=N<=1000

提示

样例说明

把3号绳上面的端点和它左边的交换,再和左边的交换一次。4号绳也做同样的工作。

*分析:最先要把靠边边的给搞直 (就是冒泡排序啦) *

code:

#include 
#include
using namespace std;
long long x=1,n,a[1100],b[1100],w,v,ans=0;
void huan(int i)
{ 
    long long u=a[x]; 
    for(int j=i;j>x;j--) 
    { 
        a[j]=a[j-1]; 
        ans++; 
    } 
    a[x]=u;    
}
int pd()
{ 
    for(int i=1;i<=n;i++)  //不多讲,暴力枚举
    { 
        if(a[i]!=b[i]) 
        { 
            return 0; 
            break; 
        } 
        
    } 
    return 1; 
}
int main()
{ 
    freopen("laundry.in","r",stdin); 
    freopen("laundry.out","w",stdout);
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i]>>b[i];
    for(int i=1;i<n;i++) 
    { 
        if(b[i]!=a[i]) //这里表示没有将晾衣绳弄直
        for(int j=x;j<=n;j++) 
        { 
            if(a[j]==b[i])//如果找到一个下插槽和上插槽相同,那么则求它俩弄直的最少交换次数,我用了函数解决
            { 
                 huan(j); break; 
            }  
        } 
        x++;
        if(pd()==1) break; //判断是否已全部弄直。
    } 
    cout<<ans<<endl;
    return 0;
}

谢谢

你可能感兴趣的:(模拟赛)