首页 > 试题广场 >

美妙的约会

[编程题]美妙的约会
  • 热度指数:6171 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
牛牛和妞妞在一天晚上决定一起去看一场情人节演唱会,可是由于这场演唱会实在太出名了,有很多情侣都来观看,牛牛和妞妞不小心被人流冲散了!
维持秩序的人决定,让大家排成一列,相邻两个进去的人(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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

/**
 * @Author: coderjjp
 * @Date: 2020-05-09 17:30
 * @Description:
 * @version: 1.0
 */
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.valueOf(br.readLine());
        String[] s = br.readLine().split(" ");
        ArrayList<Integer> a = new ArrayList<>();
        for (int i = 0; i < 2*n; i++)
            a.add(Integer.valueOf(s[i]));
        int count = 0;
        for (int i = 0; i < 2*n - 2; i = i +2){
            int next = a.lastIndexOf(a.get(i));
            count += (next - i -1);
            for (int j = next; j >= i + 2; j--)
                a.set(j, a.get(j - 1));
        }
        System.out.println(count);
    }
}

发表于 2020-05-09 17:47:31 回复(0)
/*
有个人的思路是这样的:
先把所有人存入集合,从第一个开始找
向后找到与他编号相同的位置,两者相减就是要交换的次数,同时把这个与他编号相同的数剔除,
后面继续上面的操作。

其实如果你仔细思考也是这么回事,比如三个人,编号如下
1 3 1 2 3 2
第一次交换:
1 1 3 2 3 2(交换一次)
第二次交换:
1 1 3 3 2 2(交换一次)
结束。其实你会发现某个数交换完成后,其他的相对位置是不变的,比如,1交换完成后,3之间的相对位置是不变的,2同样

因此我们可以把它放到集合里面,找到与他相同编号的,就把那个剔除(记录交换次数),这也不会印象其他的编号交换
如:
找到第二个1后:
1 3 2 3 2(交换一次)
找到第二个3后:
1 3 2 2(交换一次)
找到第二个2后:
1 3 2(交换0次)
*/
import java.io.*;
import java.util.ArrayList;
public class Main{
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader( new InputStreamReader( System.in ));
        int n = Integer.parseInt(br.readLine());
        String[] str = br.readLine().split(" ");
        ArrayList<Integer> list = new ArrayList<Integer>();
        for(int i = 0;i<2*n;i++)
            list.add(Integer.parseInt(str[i]));
        
        //开始计数
        int count = 0;
        int i = 0;
        while(i<list.size()){
            int secIndex = list.lastIndexOf(list.get(i));
            count += (secIndex-i-1);
            list.remove(secIndex);
            i++;
        }
        System.out.println(count);
    }
}
借鉴的方法,不喜勿喷
发表于 2020-05-04 14:03:13 回复(0)
Java解法,算法简单,但复杂度为O(n2)

import java.util.ArrayList;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < 2 * n; i++) {
            list.add(scanner.nextInt());
        }
        int result=0;
        int i=0;
        while (i<=list.size()-3){
            int secondIndex=list.lastIndexOf(list.get(i));
            result+=secondIndex-i-1;
            list.remove(secondIndex);
            i++;
        }
        System.out.println(result);
    }
}



编辑于 2020-03-01 15:51:40 回复(1)