题目链接:
http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1349
题目大意:给一个mxn的平面,有q个位置,每个位置坐标为(u,v)有w人,求一个点在平面内使得所有人都到这个点的曼哈顿距离之和最小(如 (x, y) 到 (p, q),那曼哈顿距离就是|x-p|+|y-q|)。
思路:分别按横纵坐标排序找出中位数即可
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define maxn 50050
using namespace std;
int numr[maxn],numc[maxn];
int main()
{
int t,kase=1;scanf("%d",&t);
while(t--)
{
int n,m,q;
scanf("%d%d%d",&m,&n,&q);
memset(numr, 0, sizeof(numr));
memset(numc, 0, sizeof(numc));
int sum=0;
for(int i=1;i<=q;i++)
{
int r,c,p;
scanf("%d%d%d",&r,&c,&p);
sum+=p,numr[r]+=p,numc[c]+=p;
}
int ansr, ansc;
int num=0;
int mid=(sum+1)/2;
for(int i=1;i<=m;i++)
{
num+=numr[i];
if(num>=mid)
{
ansr=i;
break;
}
}
num=0;
for(int i=1; i<=n; i++)
{
num+=numc[i];
if(num>=mid)
{
ansc=i;
break;
}
}
printf("Case %d: %d %d\n",kase++,ansr,ansc);
}
}