版权声明:转载无所谓的。。。 https://blog.csdn.net/xuxiayang/article/details/82822200
大意
给定 个点,它们会增加同行、同列的代价,距离越远加的越多,求在哪个点总代价最少
思路
比较容易想到,这个点即为所有点的中位点
因为要求在距离相等的情况下使横纵坐标尽可能小,所以在偶数的情况下选编号更小的点即可。
代码
#include<cstdio>
#include<algorithm>
using namespace std;int n,m,z,a[100001],b[100001],c,x,y,mid;
long long ans;
signed main()
{
scanf("%d%d%d",&n,&m,&z);
for(register int i=1;i<=m;i++)//输入
{
scanf("%d%d%d",a+i,b+i,&c);//输入
ans+=c;//这个代价是固定的
}
mid=(m&1)?m/2+1:m/2;//特殊处理相等的情况
sort(a+1,a+1+m);
sort(b+1,b+1+m);
x=a[mid];y=b[mid];//求出中位点
for(register int i=1;i<=m;i++)ans+=abs(x-a[i])+abs(y-b[i]);//计算距离差距
printf("%lld\n%d %d",ans,x,y);//输出
}