解题思路

这是一道求最少交换次数的题目,主要思路如下:

  1. 问题分析:

    • 对情侣需要坐在相邻位置
    • 可以通过相邻位置的交换来调整座位
    • 需要计算最少的交换次数
  2. 贪心策略:

    • 从后向前处理每对情侣
    • 对于每对情侣,找到对应编号的人
    • 通过相邻交换将其移动到正确位置
    • 累计交换次数
  3. 优化:

    • 最终结果需要减去 ,因为每对情侣实际只需要 次交换
    • 使用相邻交换可以保证最小交换次数

代码

#include <iostream>
using namespace std;

const int MAXN = 200;

// 交换相邻位置
void swap(int pos, int arr[]) {
    int temp = arr[pos];
    arr[pos] = arr[pos + 1];
    arr[pos + 1] = temp;
}

// 计算单个数字需要的交换次数
int countSwaps(int n, int arr[]) {
    int target = arr[2*n-1];
    int swaps = 0;
    
    // 找到目标数字并交换到正确位置
    for(int i = 0; i <= 2*n-2; i++) {
        if(arr[i] == target) {
            swap(i, arr);
            swaps++;
        }
    }
    return swaps;
}

int main() {
    int n;
    cin >> n;
    
    int arr[MAXN];
    // 读入座位安排
    for(int i = 0; i < 2*n; i++) {
        cin >> arr[i];
    }
    
    // 计算总交换次数
    int totalSwaps = 0;
    for(int i = n; i > 0; i--) {
        totalSwaps += countSwaps(i, arr);
    }
    
    // 输出结果(减去n)
    cout << totalSwaps - n << endl;
    return 0;
}
import java.util.Scanner;

public class Main {
    static final int MAXN = 200;
    
    // 交换相邻位置
    static void swap(int pos, int[] arr) {
        int temp = arr[pos];
        arr[pos] = arr[pos + 1];
        arr[pos + 1] = temp;
    }
    
    // 计算单个数字需要的交换次数
    static int countSwaps(int n, int[] arr) {
        int target = arr[2*n-1];
        int swaps = 0;
        
        for(int i = 0; i <= 2*n-2; i++) {
            if(arr[i] == target) {
                swap(i, arr);
                swaps++;
            }
        }
        return swaps;
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        
        int[] arr = new int[MAXN];
        // 读入座位安排
        for(int i = 0; i < 2*n; i++) {
            arr[i] = sc.nextInt();
        }
        
        // 计算总交换次数
        int totalSwaps = 0;
        for(int i = n; i > 0; i--) {
            totalSwaps += countSwaps(i, arr);
        }
        
        // 输出结果
        System.out.println(totalSwaps - n);
    }
}
def swap(pos, arr):
    """交换相邻位置"""
    arr[pos], arr[pos + 1] = arr[pos + 1], arr[pos]

def count_swaps(n, arr):
    """计算单个数字需要的交换次数"""
    target = arr[2*n-1]
    swaps = 0
    
    for i in range(2*n-1):
        if arr[i] == target:
            swap(i, arr)
            swaps += 1
    
    return swaps

def main():
    n = int(input())
    arr = list(map(int, input().split()))
    
    # 计算总交换次数
    total_swaps = 0
    for i in range(n, 0, -1):
        total_swaps += count_swaps(i, arr)
    
    # 输出结果
    print(total_swaps - n)

if __name__ == "__main__":
    main()

算法及复杂度

  • 算法:贪心算法
  • 时间复杂度: - 需要处理 对情侣,每对最多需要 次交换
  • 空间复杂度: - 需要存储座位数组