纪中OJ 5775【NOIP2008模拟】农夫约的假期

思维题

不难发现,这题是求一个最小曼哈顿距离和,之后呢,我们通过"平面上有一堆点,选一个点,使距离和最小,这个点一定是坐标的平均值,类比可得,在曼哈顿距离下,这个点因该是这一堆点的横纵坐标的中间值,然后就大力尝试,结果就A了

代码

//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lli long long int
using namespace std;
const int M=100500;
int n,m,e;
struct poi{int x,y,p;}qlm[M];
inline bool cmp1(poi a,poi b){return a.x<b.x;}
inline bool cmp2(poi a,poi b){return a.y<b.y;}
inline int read()
{
	int x=0;char ch=getchar();
	while (ch>'9'||ch<'0') ch=getchar();
	while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return x;
}
signed main()
{
	freopen("shuru.in","r",stdin);
	freopen("shuru.out","w",stdout);
	n=read();m=read();e=read();
	for (int i=1;i<=m;i++)
	qlm[i].x=read(),qlm[i].y=read(),qlm[i].p=read();
	sort(qlm+1,qlm+m+1,cmp1);int a,b;
	if (m%2) a=qlm[m/2+1].x;
	else a=qlm[m/2].x;
	sort(qlm+1,qlm+m+1,cmp2);lli ans=0;
	if (m%2) b=qlm[m/2+1].y;
	else b=qlm[m/2].y;
	for (int i=1;i<=m;i++)
	{
		ans+=(abs(qlm[i].x-a)+abs(qlm[i].y-b)+qlm[i].p);
	}
	cout<<ans<<endl<<a<<" "<<b;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ACerAndAKer/article/details/81543153