今天继续刷牛客,网易的堆棋子。
分析:
给定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)))