问题描述:
牛牛和妞妞在一天晚上决定一起去看一场情人节演唱会,可是由于这场演唱会实在太出名了,有很多情侣都来观看,牛牛和妞妞不小心被人流冲散了!
维持秩序的人决定,让大家排成一列,相邻两个进去的人(2k-1和2k,k为正整数)坐在相邻座位。但是现在的队伍乱糟糟的,有很多情侣都不在相邻位置。维持秩序的人同意让情侣们跟相邻的人交换位置,直到所有情侣都在2k-1和2k位置上为止。
但是维持秩序的人很没有耐心,所以需要最少的交换次数,你能帮情侣们算出这个次数吗?
输入描述:
第一行一个整数n,表示一共有n对情侣,编号从1到n。同一对情侣编号相同。1<=n<=100
第二行2n个整数ai,表示编号为ai的情侣在第i个位置。1<=ai<=n
输出描述:
一个整数,代表最少交换次数。
分析:还是靠分析和猜测吧,主要是找的合适的移动方式。(有点贪心算法的韵味)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.HashMap;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.valueOf(br.readLine());
String[] sArray = br.readLine().split(" ");
Map<String, Integer> map = new HashMap<>();
int[] index = new int[2 * n];
int count = 0;
for(int i = 0; i < n * 2; i++) {
index[i] = i;
if(map.containsKey(sArray[i])) {
count += (i - index[map.get(sArray[i])] - 1);
int loc = map.get(sArray[i]);
for(int j = loc + 1 ; j < i; j++) {
index[j]++;
}
}else {
map.put(sArray[i], i);
}
}
System.out.println(count);
}
}