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 }

时间: 2024-08-13 21:24:25

hdu 2014鞍山赛区 5073 Galaxy的相关文章

HDU 5074 Hatsune Miku(2014鞍山赛区现场赛E题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5074 解题报告:给出一个长度为n的序列,例如a1,a2,a3,a4......an,然后这个序列的美丽值就是socre[a1][a2] + socre[a2][a3] + ..... socre[an-1][an],但是这个序列里面并不是所有的数都是确定的,输入包含一些大于0的数和一些-1,-1表示这个数可以任意,但是要在m的范围内,给出socre[i][j],求这个序列最大的美丽值. 一个二维dp

HDU 5071 Chat(2014鞍山赛区现场赛B题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5071 解题报告:一个管理聊天窗口的程序,一共有八种操作,然后要注意的就是Top操作只是把编号为u的窗口标记为一种特殊的状态,在这种特殊的状态下优先级是最高的,聊天都是跟这个聊,而这个窗口并没有在实际上被提到最前面.还有就是每句后面都有句号.我本来可以1A的,但就是因为没看这个,所以一直WA也找不到原因. 暴力模拟就可以了,因为点最多只有5000个,不会超时,维护一个队列就可以了,但我为了方便判断是不

hdu 5073 Galaxy(2014acm亚洲赛区鞍山 D)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5073 Galaxy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 768    Accepted Submission(s): 179 Special Judge Problem Description Good news for u

hdu 5073 Galaxy(2014acm亚洲赛区鞍山 C)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5073 Galaxy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 768    Accepted Submission(s): 179 Special Judge Problem Description Good news for u

HDU 5073 Galaxy (2014鞍山现场赛D题)

题目链接:HDU 5073 Galaxy 题意:在一维的坐标系里,给出N个点坐标,转动K个点,使转动后这个星系的的惯性最小(根据题意惯性最小也就是 求所有星星到星系中心的距离最小,这个可以理解成方差最小).求最小的惯性. 思路: 先对序列排序,再求出算N-K个点惯性的递推式. 以三个为例: 预处理是 平均数和各项的平方和, 注意:n==k的特判 AC代码: #include <stdio.h> #include <algorithm> using namespace std; do

HDU 5073 Galaxy(贪心)

题目链接:HDU 5073 Galaxy 题面: Galaxy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 2571    Accepted Submission(s): 642 Special Judge Problem Description Good news for us: to release the financia

hdu 5073 Galaxy(数学)

题目链接:hdu 5073 Galaxy 题目大意:给定N个点,可以移动其中的K的点,问说最后I的最小值可以是多少. 解题思路:因为质量都为1嘛,所以就是求方差,可以移动K个,所以即选连续的n=N-K个使得方差最小.注意N=K的情 况. S表示n个数的和,T表示n个数平方的和,那么这n个数的方差即为T - S * S / n,然后扫描一遍数组维护S,T,并且计算 方差的最小值. #include <cstdio> #include <cstring> #include <al

hdu5073 2014鞍山现场赛D题

http://acm.hdu.edu.cn/showproblem.php?pid=5073 Galaxy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 1421    Accepted Submission(s): 324 Special Judge Problem Description Good news for us: t

hdu 2014 青年歌手大奖赛_评委会打分

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2014 题目大意:去掉一个最高分和一个最低分求平均数. 1 #include<stdio.h> 2 int main() 3 { 4 double n,a,i,s,max,min; 5 while(scanf("%lf",&n)!=EOF) 6 { 7 s=0;max=0;min=10000; 8 if(n>2&&n<=100) 9 { 10