列表

详情


WY80. 美妙的约会

描述

牛牛和妞妞在一天晚上决定一起去看一场情人节演唱会,可是由于这场演唱会实在太出名了,有很多情侣都来观看,牛牛和妞妞不小心被人流冲散了!
维持秩序的人决定,让大家排成一列,相邻两个进去的人(2k-1和2k,k为正整数)坐在相邻座位。但是现在的队伍乱糟糟的,有很多情侣都不在相邻位置。维持秩序的人同意让情侣们跟相邻的人交换位置,直到所有情侣都在2k-1和2k位置上为止。
但是维持秩序的人很没有耐心,所以需要最少的交换次数,你能帮情侣们算出这个次数吗?

输入描述

第一行一个整数n,表示一共有n对情侣,编号从1到n。同一对情侣编号相同。1<=n<=100
第二行2n个整数ai,表示编号为ai的情侣在第i个位置。1<=ai<=n

输出描述

一个整数,代表最少交换次数。

示例1

输入:

3
3 3 2 2 1 1

输出:

0

示例2

输入:

4
1 2 3 4 1 2 3 4

输出:

6

原站题解

C 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2020-07-23

#include <stdio.h>
int main()
{
    int n;
    int left=0,right,count=0;
    scanf("%d ",&n);
    int a[2*n],flag[2*n];
    for(int i=0;i<2*n;i++)
    {
        scanf("%d",&a[i]);
        flag[i]=1;
    }
        while(left<2*n)
        {
            if(flag[left])
            {
                flag[left]=0;
                right=left+1;
                while((right<2*n)&&(a[left]!=a[right]))
                {
                    count+=flag[right];
                    right++;
                }
                flag[right]=0;
            }
            left++;
        }
    printf("%d",count);
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 364KB, 提交时间: 2019-11-06

#include<stdio.h>
#define maxlength 200
int count(int n,int p[]);
void swap(int a,int p[]);
int main(void)
{
    int n;
    int i,j;
    int a[maxlength];;
    int distance=0;
    int test=0;
    scanf("%d",&n);
    int sum=2*n;
    for(i=0;i<sum;i++)
    {
        scanf("%d",&a[i]);
    }
    for(j=n;j>0;j--)
    {
        distance+=count(j,a);
    }
    printf("%d",distance-n);
}
 int count(int n,int p[])
{
    int k=p[2*n-1];
    int i;
    int distance=0;
    for(i=0;i<=(2*n-2);i++)
    {
        if(p[i]==k)
        {
            swap(i,p);
            distance++;
        }
    }
    return distance;
}
void swap(int a,int p[])
{
    int i;
    i=p[a];
    p[a]=p[a+1];
    p[a+1]=i;
}

上一题