问题 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
 

输出

小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 坐标的值。

 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 }
View Code
 
原文地址:https://www.cnblogs.com/DWVictor/p/10202509.html