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