牛客真题(10)-堆棋子

今天继续刷牛客,网易的堆棋子。

分析:
给定n个棋子的横纵坐标,然后输出i个棋子放在一起的移动距离。解法其实有点类似暴力解决,通过计算每个棋子到其他所有棋子的曼哈顿距离,并更新移动距离和的最小值。

问题:
1、用临时变量存储当前点到所有点的距离;
2、计算距离的最小值。

附上C++代码:

#include<bits/stdc++.h>

using namespace std;

int main()
{
    int n;
    cin>>n;
    vector<int> x(n),y(n);
    for(int i=0;i<n;i++)
        cin>>x[i];
    for(int i=0;i<n;i++)
        cin>>y[i];
    priority_queue<int,vector<int>,greater<int>> pq;
    vector<int> result(n,INT_MAX);
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
            for(int k=0;k<n;k++)
                pq.push(abs(x[k]-x[i])+abs(y[k]-y[j]));
            int temp=0;
            for(int k=0;k<n;k++){
                temp+=pq.top();
                result[k]=min(result[k],temp);
                pq.pop();
            }
        }
    for(int i=0;i<n;i++)
    {
        if(i==0)
            cout<<result[i];
        else
            cout<<" "<<result[i];
    }
    cout<<endl;
    return 0;
}

附上Python代码:

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

dist = [float('Inf') for _ in range(n)]
for i in range(n):
    for j in range(n):
        t = 0
        tmp = []
        for k in range(n):
            tmp.append(abs(x[i]-x[k])+abs(y[j]-y[k]))
        tmp.sort()
        for k in range(n):
            t += tmp[k]
            dist[k] = min(dist[k], t)

print(' '.join(map(str, dist)))

猜你喜欢

转载自blog.csdn.net/JerryZengZ/article/details/88973147
今日推荐