解题思路

  1. 这是一个最小曼哈顿距离的问题。对于每个目标位置 ,我们需要计算将 个棋子移动到该位置所需的最小步数。
  2. 对于每个目标位置,我们计算所有棋子到该位置的曼哈顿距离。
  3. 将距离排序后,取前 个距离之和,即为将 个棋子移动到该位置所需的步数。
  4. 遍历所有可能的目标位置,更新每个 的最小步数。

代码

#include<iostream>
#include<algorithm>
using namespace std;

int n, x[55], y[55], ans[55]; 

void helper() {
    // 遍历所有可能的目标位置
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            int dis[n], tmp = 0;
            // 计算所有棋子到当前位置的曼哈顿距离
            for(int k = 0; k < n; k++) 
                dis[k] = abs(x[i]-x[k]) + abs(y[j]-y[k]);
            // 排序距离数组
            sort(dis, dis+n);
            // 计算并更新k个棋子的最小移动步数
            for(int k = 0; k < n; k++) {
                tmp += dis[k];
                ans[k] = ans[k]>tmp ? tmp : ans[k];
            } 
        }
    }
}

int main() {
    cin >> n;
    for(int i = 0; i < n; i++) cin >> x[i];
    for(int i = 0; i < n; i++) cin >> y[i];
    // 初始化答案数组
    for(int i = 0; i < n; i++) ans[i] = 10000000000;
    
    helper();
    
    // 输出结果
    for(int i = 0; i < n; i++) {
        cout << ans[i];
        if(i < n-1) cout << " ";
    }
    return 0;
}
import java.util.*;

public class Main {
    static int n;
    static int[] x = new int[55];
    static int[] y = new int[55];
    static long[] ans = new long[55];
    
    public static void helper() {
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                int[] dis = new int[n];
                long tmp = 0;
                for(int k = 0; k < n; k++) 
                    dis[k] = Math.abs(x[i]-x[k]) + Math.abs(y[j]-y[k]);
                Arrays.sort(dis);
                for(int k = 0; k < n; k++) {
                    tmp += dis[k];
                    ans[k] = ans[k]>tmp ? tmp : ans[k];
                }
            }
        }
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        for(int i = 0; i < n; i++) x[i] = sc.nextInt();
        for(int i = 0; i < n; i++) y[i] = sc.nextInt();
        for(int i = 0; i < n; i++) ans[i] = 10000000000L;
        
        helper();
        
        for(int i = 0; i < n; i++) {
            System.out.print(ans[i]);
            if(i < n-1) System.out.print(" ");
        }
    }
}
def helper(n, x, y):
    ans = [10000000000] * n
    for i in range(n):
        for j in range(n):
            dis = [abs(x[i]-x[k]) + abs(y[j]-y[k]) for k in range(n)]
            dis.sort()
            tmp = 0
            for k in range(n):
                tmp += dis[k]
                ans[k] = tmp if tmp < ans[k] else ans[k]
    return ans

n = int(input())
x = list(map(int, input().split()))
y = list(map(int, input().split()))

result = helper(n, x, y)
print(' '.join(map(str, result)))

算法及复杂度

  • 算法:枚举 + 排序
  • 时间复杂度:
    • 需要遍历 个目标位置
    • 对于每个位置需要计算 个距离并排序
  • 空间复杂度:
    • 需要存储距离数组和答案数组