ACM/ICPM2014鞍山现场赛D Galaxy (HDU 5073)
2015-12-17 18:12
120 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5073
题意:给定一条线上的点,然后能够去掉当中的m个,使剩下的到重心的距离最小,
因为重心等于距离的平均值。因此也就是求方差最小。
分析:
由于要去掉m个所以一定剩下n-m个,我们枚举这一串点的起始位置从1開始 一直枚举到m,
然后由平方和的公式展开。预处理一下前几项平方和。以及前几项的和就可以,复杂度为O(N);
代码例如以下:
题意:给定一条线上的点,然后能够去掉当中的m个,使剩下的到重心的距离最小,
因为重心等于距离的平均值。因此也就是求方差最小。
分析:
由于要去掉m个所以一定剩下n-m个,我们枚举这一串点的起始位置从1開始 一直枚举到m,
然后由平方和的公式展开。预处理一下前几项平方和。以及前几项的和就可以,复杂度为O(N);
代码例如以下:
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> using namespace std; const int maxn = 50010; long long a[maxn]; int main() { int n,m,t; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%I64d",&a[i]); if(n==m){ printf("0\n"); continue; } sort(a+1,a+n+1); long long sum1=0,sum2=0; for(int i=1;i<=n-m;i++){ sum1+=a[i]; sum2+=a[i]*a[i]; } double mess = sum1*1.0/(n-m); double ans = sum2 + (n-m)*mess*mess - 2*sum1*mess; for(int i=1;i<=m;i++){ sum1 = sum1-a[i]+a[n-m+i]; sum2 = sum2 - a[i]*a[i]+a[n-m+i]*a[n-m+i]; mess = sum1*1.0/(n-m); ans = min(ans,sum2 + (n-m)*mess*mess - 2*sum1*mess); } printf("%.10lf\n",ans); } return 0; } /*** 100 3 2 -1 0 1 4 2 -2 -1 1 2 ****/
相关文章推荐
- alien 进行rpm 包和deb 包之间的转换
- development
- RPM-GPG-KEY详解
- 产品经理入门之三步分解需求
- Power management interface(PM API)
- rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY
- PMCAFF问答龙虎榜,大神云集,等你挑战
- 使用canvas.drawBitmapMesh扭曲图像
- 已完结 | PMCAFF深度报告:《 典典养车如何在一年内做到600万用户、三轮融资、覆盖40城市》
- 点击MPMoviePlayerController播放视频时,出现一个黑屏闪屏的现象
- 关于npm的环境变量配置、prefix
- PMC推出Smart系列解决方案 提供高效数据中心连接
- PMC推出Smart系列解决方案 提供高效数据中心连接
- 安装MySQL提示“请键入 NET HELPMSG 3534 以获得更多的帮助”的解决办法
- rtpMIDI Tutorial
- 周鸿祎教你怎么做产品经理
- CCBPM 表结构说明
- 专家:雾霾天PM2.5会渗进室内 里外差别不大
- 产品经理职责:如何对产品进行数据分析?
- 学习popupmenu