问题 H: 小k的简单问题
Posted dwvictor
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了问题 H: 小k的简单问题相关的知识,希望对你有一定的参考价值。
问题 H: 小k的简单问题
时间限制: 1 Sec 内存限制: 128 MB提交: 107 解决: 57
[提交] [状态] [命题人:jsu_admin]
题目描述
地图上有n个村庄,小k每个月需要往每个村庄运送数量不等的粮食,运送粮食到任意一个村庄需要消耗的费用为距离的平方乘以粮食的重量,现在小k打算在地图上建立粮食基地,请问将基地建在哪个地方才能让小k每个月消耗的费用最少?
输入
第一行包含一个整数 T,表示有 T组测试数据。
接下来依次描述 T 组测试数据。对于每组测试数据:
第一行为整数 n,表示有n个村庄。
接下来 n 行,每行三个整数x,y,v,前两整数个为村庄的坐标,后面一个整数为该村庄每个月需要的粮食重量。
0<T<20,0<n<20, -1000<=x,y<=1000,0<v<100
接下来依次描述 T 组测试数据。对于每组测试数据:
第一行为整数 n,表示有n个村庄。
接下来 n 行,每行三个整数x,y,v,前两整数个为村庄的坐标,后面一个整数为该村庄每个月需要的粮食重量。
0<T<20,0<n<20, -1000<=x,y<=1000,0<v<100
输出
小k建立粮食基地的坐标(保留两位小数)
样例输入 Copy
1
3
167 -100 44
78 262 21
-245 -27 1
样例输出 Copy
132.44 16.29
已知每个村庄的位置 xi,yi,以及需要运送的粮食重量 vi,设基地的位置在 x,y,那么小 k 运送粮食到任意一个村庄消耗的费用为(x-xi)*(x-xi)*vi+(y-yi)*(y-yi)*vi,由此可只 x 坐 标和 y 坐标可以分开来算,将所有消耗相加起来得到一个关于 x 的方程,a*x*x-b*x+c, 可转化为由此可得出当 x = b/(2*a)时消耗最小,同理可得出 y 坐标的值。
![技术分享图片](/img/jia.gif)
1 #include<stdio.h> 2 #include<algorithm> 3 using namespace std; 4 const int maxn = 1010; 5 int main(){ 6 int t; 7 double a[maxn],b[maxn],c[maxn]; 8 scanf("%d",&t); 9 while(t--) 10 { 11 int n; 12 scanf("%d",&n); 13 double z=0,x=0,v=0; 14 for(int i = 1;i <=n;i++) 15 { 16 scanf("%lf%lf%lf",&a[i],&b[i],&c[i]); 17 z += a[i]*c[i]; 18 x += b[i]*c[i]; 19 v += c[i]; 20 } 21 sort(a+1,a+n+1); 22 sort(b+1,b+n+1); 23 // double l_1 = a[n],r_1 = a[1]; 24 // double l_2 = b[n],r_2 = b[1]; 25 // double sum = 0; 26 // for(int i = 0;i < n;i++) 27 // { 28 // sum = sqrt((a[1]-a[i])*(a[1]-a[i])+(b[1]-b[i])*(b[1]-b[i])); 29 // } 30 // for(int i = 0;i<100;i++) 31 // { 32 // mid_1 = (l_1+r_1) / 2; 33 // mid_2 = (l_2+r_2) / 2; 34 // for(int i = 0;i<n;i++) 35 // double mid = sqrt((mid_1-a[i])*(mid_1-a[i])+(mid_2-b[i])*(mid_2-b[i])) 36 // if(mid < sum) 37 // { 38 // sum = mid; 39 // 40 // } 41 // } 42 43 printf("%.2f %.2f ",z/v,x/v); 44 } 45 }
以上是关于问题 H: 小k的简单问题的主要内容,如果未能解决你的问题,请参考以下文章