hdu 5073 推公式相邻质心转换

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N  51000
int cmp(const void *a,const void *b) {
return *(int *)a-*(int *)b;
}
int a[N];
int sum[N];
double all[N];
double ss(int a,double b) {
return (1.0*a-b)*(1.0*a-b);
}
double  Min(double a,double b) {
return a>b?b:a;
}
int main() {
    int n,m,i,t;
    double ans,maxx;
    scanf("%d",&t);
    while(t--) {
        scanf("%d%d",&n,&m);
        for(i=1;i<=n;i++)
            scanf("%d",&a[i]);
            qsort(a+1,n,sizeof(a[0]),cmp);
            sum[0]=0;
        for(i=1;i<=n;i++)
            sum[i]=sum[i-1]+a[i];
        for(i=1;i<=m+1;i++)
    all[i]=1.0*(sum[i+n-m-1]-sum[i-1])/(n-m);
  //  printf("%d
",sum[n-m]);
 // printf("%.10f
",all[1]);
 ans=0;
        for(i=1;i<=n-m;i++)
            ans+=1.0*ss(a[i],all[1]);
            maxx=ans;
        //   printf("%.10f
",maxx);
            for(i=2;i<=m+1;i++) {
            ans=ans-2.0*(sum[i+n-m-2]-sum[i-1])*(all[i]-all[i-1])-1.0*ss(a[i-1],all[i-1])+1.0*ss(a[i+n-m-1],all[i])+(n-m-1)*(all[i]*all[i]-all[i-1]*all[i-1]);
            maxx=Min(maxx,ans);
            }
   printf("%.10f
",maxx);
    }
return 0;}

原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410566.html