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 }

 

posted @ 2017-08-25 00:58  Yeader  阅读(355)  评论(0编辑  收藏  举报