2018年9月23日提高组模拟赛 T1 农夫约的假期

版权声明:转载无所谓的。。。 https://blog.csdn.net/xuxiayang/article/details/82822200

大意

给定 m m 个点,它们会增加同行、同列的代价,距离越远加的越多,求在哪个点总代价最少


思路

比较容易想到,这个点即为所有点的中位点

因为要求在距离相等的情况下使横纵坐标尽可能小,所以在偶数的情况下选编号更小的点即可。


代码

#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);//输出
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/82822200