• ECNUOJ 2616 游黄山


    游黄山

    Time Limit:1000MS Memory Limit:65536KB
    Total Submit:165 Accepted:52 Special Judge

    Description

    Pollux最近到黄山游玩,他需要在黄山上找一个住宿的地方,Pollux很懒,所以他喜欢住在尽量靠近景点的地方,这样他就可以少走一些路.
    现在一张黄山地图上有N个景点,P1(X1,Y1)、P2(X2,Y2)、 …Pn(Xn,Yn)Pollux对每个景点都有一个喜爱值W1,W2,…,Wi,Wn,如果Pollux住在P(X,Y),他到景点Pi的距离Di=|Xp-Xi|+|Yp-Yi|.Pollux希望你能帮他找到
    一点P(X,Y),使得D=W1*D1+W2*D2+…+Wi*Di+…+Wn*Dn 有最小值. Pollux很强,可以住在任何地方

    Input

    第一行为一个整数T,表示测数数据的组数.
    每组数据的第一行为 正整数N(1<=N<=100)
    第二行至第N+1行,每行有三个数,第一和第二个数分别是这个点的X与Y的坐标Pi(xi,yi),第三个数为Pollux对这个景点的喜爱值Wi.(xi , yi, wi均为浮点小数,且wi为正数)

    Output

    每组测试数据输出三个数独占一行,分别是P点坐标 X 与 Y 和 最小的D值.
    可能存在多个满足条件的P点,你只需要输出任意一个即可
    三者之间用空格分隔,末尾不要空格,D值相对误差不能超过0.01

    Sample Input

    3
    1
    63.34 184.67 0.41
    2
    0.00 0.00 1.00
    10.00 0.00 1.00
    3
    281.45 57.05 244.64
    99.61 168.27 232.81
    119.42 29.95 4.91

    Sample Output

    63.340000 184.670000 0.000000
    7.000000 0.000000 10.000000
    281.450000 57.050000 69155.926900

    Source

    华东师范大学2009校赛

    解题:一道带权中位数题目

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 struct Point {
     4     double x,y,w;
     5 } p[200];
     6 double sum[200];
     7 bool cmpx(const Point &a,const Point &b) {
     8     return a.x < b.x;
     9 }
    10 bool cmpy(const Point &a,const Point &b) {
    11     return a.y < b.y;
    12 }
    13 int main() {
    14     int kase,n;
    15     scanf("%d",&kase);
    16     while(kase--) {
    17         scanf("%d",&n);
    18         for(int i = 0; i < n; ++i)
    19             scanf("%lf %lf %lf",&p[i].x,&p[i].y,&p[i].w);
    20         sort(p,p+n,cmpx);
    21         sum[0] = p[0].w;
    22         for(int i = 1; i < n; ++i)
    23             sum[i] = p[i].w + sum[i-1];
    24         double total = sum[n-1],x,y;
    25         for(int i = 0; i < n; ++i) {
    26             double left = i?sum[i-1]:0;
    27             double right = sum[n-1] - sum[i];
    28             if(left <= 0.5*total && right <= 0.5*total) {
    29                 x = p[i].x;
    30                 break;
    31             }
    32         }
    33         sort(p,p+n,cmpy);
    34         sum[0] = p[0].w;
    35         for(int i = 1; i < n; ++i)
    36             sum[i] = sum[i-1] + p[i].w;
    37         for(int i = 0; i < n; ++i) {
    38             double left = i?sum[i-1]:0;
    39             double right = sum[n-1] - sum[i];
    40             if(left <= 0.5*total && right <= 0.5*total) {
    41                 y = p[i].y;
    42                 break;
    43             }
    44         }
    45         double ret = 0;
    46         for(int i = 0; i < n; ++i)
    47             ret += p[i].w*(fabs(p[i].x - x) + fabs(p[i].y - y));
    48         printf("%.6f %.6f %.6f
    ",x,y,ret);
    49     }
    50     return 0;
    51 }
    View Code
  • 相关阅读:
    BZOJ 1500 维修数列
    BZOJ 1501 智慧珠游戏
    BZOJ 1507 Editor
    BZOJ 3223 文艺平衡树
    BZOJ 3224 普通平衡树
    BZOJ 3196 二逼平衡树
    BZOJ 1048 分割矩阵
    BZOJ 1047 理想的正方形
    BZOJ 1046 上升序列
    BZOJ 1045 糖果传递
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/4627586.html
Copyright © 2020-2023  润新知