LightOJ 1349 Aladdin and the Optimal Invitation(中位数)
题目链接:https://vjudge.net/contest/28079#problem/N
题目大意:给一个mxn的平面,有q个位置,每个位置坐标为(u,v)有w人,求一个点在平面内使得所有人都到这个点的曼哈顿距离之和最小(如 (x, y) 到 (p, q),那曼哈顿距离就是|x-p|+|y-q|)。
解题思路:分别按横纵坐标排序找出中位数即可(中位数请自行百度)。
代码:
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int N=5e5+5; 5 6 struct node{ 7 int x,y,cnt; 8 }a[N]; 9 10 bool cmp1(node a,node b){ 11 return a.x<b.x; 12 } 13 14 bool cmp2(node a,node b){ 15 return a.y<b.y; 16 } 17 18 int main(){ 19 int T; 20 scanf("%d",&T); 21 int cas=0; 22 while(T--){ 23 int m,n,q,x,y; 24 scanf("%d%d%d",&m,&n,&q); 25 int xsum=0,ysum=0,count=0; 26 for(int i=1;i<=q;i++){ 27 scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].cnt); 28 count+=a[i].cnt; 29 } 30 int mid=(count+1)/2; 31 //按横坐标排序 32 sort(a+1,a+q+1,cmp1); 33 int sum=0; 34 for(int i=1;i<=q;i++){ 35 sum+=a[i].cnt; 36 if(sum>=mid){ 37 if(count&1) 38 x=a[i].x; 39 else{ 40 if(sum==mid) 41 x=(a[i].x+a[i+1].x)/2; 42 else 43 x=a[i].x; 44 } 45 break; 46 } 47 } 48 //按纵坐标排序 49 sort(a+1,a+q+1,cmp2); 50 sum=0; 51 for(int i=1;i<=q;i++){ 52 sum+=a[i].cnt; 53 if(sum>=mid){ 54 if(count&1) 55 y=a[i].y; 56 else{ 57 if(sum==mid) 58 y=(a[i].y+a[i+1].y)/2; 59 else 60 y=a[i].y; 61 } 62 63 break; 64 } 65 } 66 printf("Case %d: %d %d\n",++cas,x,y); 67 } 68 }