[NOIP模拟]农夫约的假期
题目
题目背景
在某国有一个叫农夫约的人,他养了很多羊,其中有两头名叫mm和hh,他们的歌声十分好听,被当地人称为“魔音”······
农夫约也有自己的假期呀!他要去海边度假,然而mm和hh不能离开他。没办法,他只好把他们两个带上。
到了海边,农夫约把他的羊放在一个(nn)的矩阵(有nn个方格)里。mm和hh十分好动,他们要走到m(m<=n*n)个地方,第i个地方的坐标为(xi,yi),每到一个地方他们会高歌一曲,制造q[i]点魔音值,因为他们的魔音十分独特,他们的声音只能横着或竖着传播。每传播一格,魔音值会增加1。(传播的格子数取最小的)接下来农夫约要住酒店。为了方便照顾小羊们,他选的酒店的坐标要在矩阵内。但小羊们的魔音让他十分头疼。他想求出魔音值最小的地方。
他还要享受他的假期,所以他把这个任务交给你了,加油(_)。
输入描述
第一行输入n、m和z。
接下来m行,每行3个正整数x[i],y[i]和q[i]。
输出描述
第一行一个整数表示魔音值最小是多少。
接下来一行两个正整数zb1和zb2,表示魔音值最小的地方的坐标(如果有多个答案,输出横坐标最小的情况下,纵坐标最小的)。
样例
样例输入
3 3 1
1 1 1
1 2 1
1 3 1
样例输出
5
1 2
题解
曼哈顿距离,他的横坐标和纵坐标距离是分开的,所以我们可以对横坐标和纵坐标分开看,分别取两个的中位数作为酒店的坐标.
代码
#include<bits/stdc++.h>
using namespace std;
namespace IO{
#define rep(i,l,r) for(int i=l,i##_end_=r;i<=i##_end_;++i)
#define fep(i,l,r) for(int i=l,i##_end_=r;i>=i##_end_;--i)
#define fi first
#define se second
#define Endl putchar('\n')
typedef long long ll;
typedef pair<int,int> pii;
template<class T>inline T Max(const T x,const T y){return x<y?y:x;}
template<class T>inline T Min(const T x,const T y){return x<y?x:y;}
template<class T>inline T fab(const T x){return x<0?-x:x;}
template<class T>inline void getMax(T& x,const T y){x=Max(x,y);}
template<class T>inline void getMin(T& x,const T y){x=Min(x,y);}
template<class T>T gcd(const T x,const T y){return y?gcd(y,x%y):x;}
template<class T>inline T readin(T x){
x=0;int f=0;char c;
while((c=getchar())<'0' || '9'<c)if(c=='-')f=1;
for(x=(c^48);'0'<=(c=getchar()) && c<='9';x=(x<<1)+(x<<3)+(c^48));
return f?-x:x;
}
}
using namespace IO;
const int maxn=100000;
const int maxm=100000;
int x[maxm+5],y[maxm+5],n,m;
ll ans;
inline void Init(){
n=readin(1),m=readin(1);readin(1);
rep(i,1,m){
x[i]=readin(1),y[i]=readin(1);
ans+=readin(1);
}
}
signed main(){
// freopen("shuru.in","r",stdin);
// freopen("shuru.out","w",stdout);
Init();
sort(x+1,x+m+1);sort(y+1,y+m+1);
int mid=(m+1)>>1;
int px=x[mid],py=y[mid];
rep(i,1,m)ans+=fab(px-x[i])+fab(py-y[i]);
printf("%lld\n%d %d\n",ans,px,py);
return 0;
}