0 1 3 10
解法
暴力枚举所有可能的点。
如图所示,黑点为输入点。所需遍历的点为红线的交点,红圈表示。
当时自己写的是遍历了外围红线所构成的封闭矩形里面所有的点了,只有60%的AC率,原因超时。
看了康学长的代码,才知道有些点不需要遍历,只需要遍历红线交点即可。
自己又重新写了一遍,给大家参考。
#include
#include
#include
using namespace std;
void getInput(vector&arr, const int &k)
{
for (int i = 0; i < k; i++)
{
cin >> arr[i];
}
}
void getDist(vector&x, vector&y, vector&dist)
{
int size = x.size();
for (int i = 0; i < size; ++i)
{
for (int j = 0; j < size; ++j)//遍历所有组合点
{
vector tempdist(size,0);
for (int k = 0; k < size; ++k)
{
tempdist[k] = abs(x[k] - x[i]) + abs(y[k] - y[j]);
}
sort(tempdist.begin(),tempdist.end());//单点距离排序
for (int m = 1; m < size; ++m)//多点距离和升序
{
tempdist[m] = tempdist[m - 1] + tempdist[m];
}
if (dist.size() == 0)
{
dist = tempdist;
}
else
{
for (int m = 0; m < size; ++m)//选择最小
{
if (tempdist[m] < dist[m])
dist[m] = tempdist[m];
}
}
}
}
}
int main()
{
int n;
vector result;
cin >> n;
vector x(n,0), y(n,0);
getInput(x, n);
getInput(y, n);
getDist(x,y, result);
for (int i = 0; i
{
cout << result[i] << " ";
}
cout << endl;
return 0;
}