1490-司令官PIPI II

题目描述
为了响应国家的号召,司令官PIPI决定在大学里面征集一批同学进入部队。计划开启后,CSU有M位同学参加报名,司令官PIPI想在里面选出N位同学。由于部队对身高有严格要求,PIPI要求这N位同学的身高尽可能接近,即选出的同学身高方差尽可能小,请你帮帮PIPI。
PS:
对于序列x1,x2,…xn,序列方差为:
s2=[(x1-k)2+(x2-k)2+…(xn-k)2]/n
其中k为序列x1,x2,…xn的均值。
输入
输入包含多组测试样例(case≤10)。
对于每组测试样例,第一行输入两个数字M,N,含义如题面所示(0<N≤M≤1e5)。
第二行输入M个数字,ai 代表第i个同学的身高(0<ai≤1e5)。
输出
对于每组测试用例,输出最小方差*N的整数部分(即向下取整)。
样例输入
5 3
1 2 3 4 5
样例输出
2

题解如下:

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+7;
double a[N];
double pre_1[N],pre_2[N];
int main(){
    int n,m;
    while(~scanf("%d%d",&m,&n)){
        for(int i=1;i<=m;i++){
            scanf("%lf",&a[i]);
        }
        sort(a+1,a+1+m);

        for(int i=1;i<=m;i++){					///前缀和预处理
            pre_1[i] = pre_1[i-1]+a[i];
            pre_2[i] = pre_2[i-1]+a[i]*a[i];
        }
        double ans = 1e18;
        for(int l=1;l+n-1<=m;l++){				///这样写防止越界
            int r = l+n-1;

            double x = (pre_1[r]-pre_1[l-1])/n;             ///均值
			
            double s = (pre_2[r]-pre_2[l-1]) - 2*(pre_1[r]-pre_1[l-1])*x + n*x*x;  ///方差*n

            ans = min(ans,s);
        }
        printf("%lld\n",(long long)ans);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值