美妙的约会

题目链接:

题目描述

牛牛和妞妞在一天晚上决定一起去看一场情人节演唱会,可是由于这场演唱会实在太出名了,有很多情侣都来观看,牛牛和妞妞不小心被人流冲散了!
维持秩序的人决定,让大家排成一列,相邻两个进去的人(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

分析:O(n^2)的复杂度
代码1:
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int a[2*n],mark[2*n];
    for(int i=0;i<2*n;i++)
    {
        cin>>a[i];
        mark[i]=1;
    }
    int left=0,right,count=0;
    while(left<2*n)
    {
        if(mark[left])
        {
            mark[left]=0;
            right=left+1;
            while(right<2*n&&a[right]!=a[left])
            {
                count+=mark[right];
                right++;
            }
            mark[right]=0;
        }
        left++;
    }
    cout<<count<<endl;
    return 0;
}

 

代码2:
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int a[2*n],mark[2*n];
    for(int i=0;i<2*n;i++)
    {
        cin>>a[i];
        mark[i]=1;
    }
    int left,right,count=0;
    for(left=0;left<2*n;left++)
    {
        if(mark[left])
        {
            mark[left]=0;
            for(right=left+1;right<2*n&&a[right]!=a[left];right++)
            {
                count+=mark[right];    
            } 
            mark[right]=0; 
        }
    }
    cout<<count<<endl;
}

 ————————————————————————————————

代码3:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,cnt,i,j;
    cin>>n;
    int a[2*n],flag[2*n];
    for(int i=0;i<2*n;i++) 
    {
        cin>>a[i];
        flag[i]=1;
    }
    for(i=0;i<2*n;i++)
    {
        if(flag[i])
        {
            flag[i]=0;
            for(j=i+1;j<2*n && a[j]!=a[i];j++)
            {
                cnt+=flag[j];
            }
            flag[j]=0;
        }
    }
    cout<<cnt<<endl;
}

 

 

 

posted @ 2020-07-24 17:58  龙龙666666  阅读(227)  评论(1编辑  收藏  举报