HDU 5073 Galaxy ——乱搞

【题目分析】

    练习赛的T1。

    只要看懂样例就可以猜结论了。

    然后大胆猜测剩下的星星是一段,其余的都移到重心上去。

    所以只要把计算的式子变形一下就很好维护了。

    居然没有1A

【代码】

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define maxn 50005

int t,n,k;
ll a[maxn],sum[maxn],sumfac[maxn];

int main()
{
    scanf("%d",&t);
    while (t--)
    {
        scanf("%d%d",&n,&k);
        F(i,1,n) scanf("%lld",&a[i]);
        if (k>=n-1){printf("0
");continue;}
        sort(a+1,a+n+1);
        sum[0]=sumfac[0]=0;
        F(i,1,n) sum[i]=sum[i-1]+a[i];
        F(i,1,n) sumfac[i]=sumfac[i-1]+a[i]*a[i];
        double ans=1e18;
        k=n-k;
        F(i,1,n-k+1)
        {ans=min(ans,(double)sumfac[i+k-1]-sumfac[i-1]+(double)(sum[i+k-1]-sum[i-1])*(sum[i+k-1]-sum[i-1])/k-(double)2*(sum[i+k-1]-sum[i-1])*(sum[i+k-1]-sum[i-1])/k);}
        printf("%f
",ans);
    }
}

  

原文地址:https://www.cnblogs.com/SfailSth/p/6435392.html