博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ECNUOJ 2616 游黄山
阅读量:5110 次
发布时间:2019-06-13

本文共 2472 字,大约阅读时间需要 8 分钟。

游黄山

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

 

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

 

1 #include 
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\n",x,y,ret);49 }50 return 0;51 }
View Code

 

转载于:https://www.cnblogs.com/crackpotisback/p/4627586.html

你可能感兴趣的文章
正整数的任意进制转换
查看>>
iOS9.0 友盟分享详细过程
查看>>
c#选择打开本地图片,并在picturebox上显示
查看>>
Portal-Basic v3.1.1 beta-1 示例工程发布
查看>>
linux 用户管理命令学习
查看>>
微信app支付详细教程
查看>>
如何查看电脑配置
查看>>
转:30分钟了解Springboot整合Shiro
查看>>
WP7:模拟开始屏幕Tile漂动效果
查看>>
一、MyBatis简介与配置MyBatis+Spring+MySql
查看>>
Golang flag包使用详解(一)
查看>>
python文件IO
查看>>
regsvr32简介
查看>>
升级到 .NET Core 2.1
查看>>
C#多线程交替赋值取值
查看>>
对Java前四章的感受
查看>>
【Linux】ping命令详解
查看>>
对团队成员公开感谢博客
查看>>
密码学总结
查看>>
java学习第三天
查看>>