日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu 2014鞍山赛区 5073 Galaxy

發布時間:2025/3/8 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 2014鞍山赛区 5073 Galaxy 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:就是給你 n 個數,代表n個星球的位置,每一個星球的重量都為 1 !
開始的時候每一個星球都繞著質心轉動,那么質心的位置就是所有的星球的位置之和 / 星球的個數
現在讓你移動 k 個星球到任意位置(多個星球可以在同一個位置并且所有的星球在同一直線上)
移動之后那么它們質心的位置就可能發生變化,求 I = sum(di^2) di (表示第i個星球到達質心的距離)最小!

設d為n-k個星球的質心位置,如果I值最小,那么移動的k個星球一定都放在另外n-k個星球的質心上,
并且這n-k個星球一定是連續的!越密集方差越小嘛.....
x1, x2, x3, x4,....x(n-k)表示余下n-k個星球的位置
思路:I = sum(di^2) = (x1-d)^2 + (x2-d)^2 + (x3-d)^2 ....
= sum(xi^2) + (n-k)*d*d - 2*d*sum(xi);

1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 #define N 50050 6 using namespace std; 7 double num[N]; 8 double s1[N], s2[N]; 9 int main(){ 10 int n, t, k; 11 scanf("%d", &t); 12 while(t--){ 13 scanf("%d%d", &n, &k); 14 for(int i=1; i<=n; ++i) 15 scanf("%lf", &num[i]); 16 sort(num+1, num+n+1);//對星球的位置排一下序 17 for(int i=1; i<=n; ++i)//分別計算前綴num[i] 的和 以及 num[i]^2的和 18 s1[i] = s1[i-1] + num[i], s2[i] = s2[i-1] + num[i]*num[i]; 19 int m = n-k; 20 double ans = 1000000000000000000.0;//ans要足夠大.... 最好不用long long,可能會超.... 21 for(int i=1; m && i+m-1<=n; ++i){ 22 int j = i+m-1; 23 double d = (s1[j] - s1[i-1])/m; 24 double tmp = s2[j] - s2[i-1] - 2*d*(s1[j] - s1[i-1]) + m*d*d; 25 if(ans > tmp) ans = tmp; 26 } 27 if(n == k) ans = 0.0; 28 printf("%.9lf\n", ans); 29 } 30 return 0; 31 } View Code

?

轉載于:https://www.cnblogs.com/hujunzheng/p/4044063.html

總結

以上是生活随笔為你收集整理的hdu 2014鞍山赛区 5073 Galaxy的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。