-----hdu 5073-Galaxy

Good news for us: to release the financial pressure, the government started selling galaxies and we can buy them from now on! The first one who bought a galaxy was Tianming Yun and he gave it to Xin Cheng as a present.

To be fashionable, DRD also bought himself a galaxy. He named it Rho Galaxy. There are n stars in Rho Galaxy, and they have the same weight, namely one unit weight, and a negligible volume. They initially lie in a line rotating around their center of mass.

Everything runs well except one thing. DRD thinks that the galaxy rotates too slow. As we know, to increase the angular speed with the same angular momentum, we have to decrease the moment of inertia.

The moment of inertia I of a set of n stars can be calculated with the formula

这里写图片描述

where w i is the weight of star i, d i is the distance form star i to the mass of center.

As DRD’s friend, ATM, who bought M78 Galaxy, wants to help him. ATM creates some black holes and white holes so that he can transport stars in a negligible time. After transportation, the n stars will also rotate around their new center of mass. Due to financial pressure, ATM can only transport at most k stars. Since volumes of the stars are negligible, two or more stars can be transported to the same position.

Now, you are supposed to calculate the minimum moment of inertia after transportation.
Input
The first line contains an integer T (T ≤ 10), denoting the number of the test cases.

For each test case, the first line contains two integers, n(1 ≤ n ≤ 50000) and k(0 ≤ k ≤ n), as mentioned above. The next line contains n integers representing the positions of the stars. The absolute values of positions will be no more than 50000.
Output
For each test case, output one real number in one line representing the minimum moment of inertia. Your answer will be considered correct if and only if its absolute or relative error is less than 1e-9.
Sample Input
2
3 2
-1 0 1
4 2
-2 -1 1 2
Sample Output
0
0.5

题目大意:
一个星球上有n个星星,它们一开始位于绕着质心的一条线上,每颗星星都是单位质量w[i](其实就是1啦),到质心的距离为d[i],定义转动惯性I为
这里写图片描述
现在你可以移动不大于k的星星的个数,使得转动惯量变小,求最小转动惯量

解题思路:
首先我们要知道质心是什么…但是我觉得题目很迷呀…它并没有说质心是什么……然后就胡乱猜测,一开始猜会不会是0,然后猜是两个相离最远的点的中心,最后猜是剩下的n-k个点的位置之和的平均数,然后就对了…反正很迷
想想就能知道了,你移的星星越多,转动惯量会越少,所以应该移k个星球,我们知道,一开始这n各点是在同一条直线,然后我们移动了k个星星,由题意可知,我们移了这k个星球后会有一个新的质心,我们设这个质心为X,我们把那k个点移动到新质心X上,会使得转动惯量小;
明白了上面的之后,我们现在要考虑的是我们要移哪几个点,首先移两边的点肯定比移中间的点要更加使得转动惯量小一些,接下来我们就要确定一个长度为n-k的区间,假设区间为d[l]….d[r],质心为X,求
|d[l]-X|^2+|d[l+1]-X|^2+…..+|d[r-1]-X|^2+|d[r]-X|^2
= (d[l]-X)^2+(d[l+1]-X)^2+…..+(d[r-1]-X)^2+(d[r]-X)^2
= d[l]^2+2*X*d[l]+X^2+d[l+1]^2+2*X*d[l+1]+X^2+….+d[r-1]^2+2*X*d[r-1]+X^2+d[r]^2+2*X*d[r]+X^2
然后我们把上面的式子合并一下
= (d[l]^2+d[l-1]^2+…+d[r-1]^2+d[r]^2)+2*X*(d[l]+d[l+1]+…+d[r-1]+d[r])+(n-k)*X*X;
X=(d[l]+d[l+1]+…+d[r-1]+d[r])/(n-k);
然后我们用sum1[i]存d[i]的前缀合,sum2[i]存d[i]^2的前缀合
转化成求化简之后式子的最小值即可
最后还要记得把初始数据排个序~


#include<iostream>
#include<math.h>
#include<stdio.h>
#include<algorithm>
#include<cstring>
#define INF 0x3f3f3f3f
using namespace std;

int n,k;
double d[50005];
double sum1[50005],sum2[50005];

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&k);
        for(int i=0; i<n; i++)
            scanf("%lf",&d[i]);
        sort(d,d+n);
        sum1[0]=d[0];
        sum2[0]=d[0]*d[0];
        for(int i=1; i<n; i++)
        {
            sum1[i]=sum1[i-1]+d[i];
            sum2[i]=sum2[i-1]+d[i]*d[i];
        }
        if(k>=n-1)
       {
            printf("0.000000000\n");
            continue;
        }
        double s1=sum2[n-k-1];
        double s2=sum1[n-k-1];
        double s3=s2/(n-k);
        double s=s1-2*s3*s2+s3*s3*(n-k);
        for(int i=1; i<=k; i++)
        {
            s1=sum2[i+n-k-1]-sum2[i-1];
            s2=sum1[i+n-k-1]-sum1[i-1];
            s3=s2/(n-k);
            double x=s1-2*s3*s2+s3*s3*(n-k);
            s=min(s,x);
        }
        printf("%.9lf\n",s);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值