このブログがものすごくわかりやすいです。


JOI2011本戦 第四問「歩くサンタクロース」 - あなたは嘘つきですかと聞かれたら「YES」と答えるブログ

#include <bits/stdc++.h>

using namespace std;
typedef long long int ll;
const int Y = 100003;
int w,h,n;
int x[Y],y[Y],sx[Y],sy[Y],ansx,ansy;
ll ans = 1000000000000000,sumd,maxd;
int main(){
	scanf("%d%d%d",&w,&h,&n);
	for(int i = 0;i < n;i++){
		int a,b;
		scanf("%d%d",&a,&b);
		x[i] = a,y[i] = b,sx[i] = a,sy[i] = b;
	}
	sort(x,x + n);
	sort(y,y + n);
	for(int i = 1;i >= 0;i--){
		for(int j = 1;j >= 0;j--){
			ll a = x[(n-i)/2];
			ll b = y[(n-j)/2];
			sumd = 0,maxd = 0;
			for(int k = 0;k < n;k++){
				ll d = abs(a-sx[k]) + abs(b-sy[k]);
				sumd += d*2;
				maxd = max(maxd,d);
			}
			if(ans > sumd - maxd){
				ans = sumd - maxd;
				ansx = a;
				ansy = b;
			}
		}
	}
	printf("%lld
%d %d
",ans,ansx,ansy);
	return 0;
}