HDU - 5073 Galaxy(数学)
2024-10-12 02:24:27
题意:n个点,运行移动k个点到任何位置,允许多个点在同一位置上。求移动k个点后,所有点到整体中心的距离的平方和最小。
分析:这题题目真的有点迷。。。一开始看不懂。得知最后是选取一个中心,于是看出来了方差的味道。这里便是求移动完成后方差的最小值,那么只需找连续n-k个最小的序列,然后把其他k个点都放在中心,即为正解。注意到(a[i]-ave)^2=a^2+ave^2-2*a*ave,可以在此化简代码。详情看代码。
#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <queue> #define ll long long using namespace std;
const int maxn = ; int main(){
int t,n,k;
ll a[maxn];
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++) scanf("%lld",&a[i]);
if(n==k){
printf("0.000000000\n");
continue;
}
sort(a+,a++n);
ll sum=,tot=;
for(int i=;i<=n-k;i++){
sum+=a[i];
tot+=a[i]*a[i];
}
double ave=(sum*1.0)/(n-k);
double ans=ave*ave*(n-k)+tot-*ave*sum;
for(int i=;i<=k+;i++){
sum=sum-a[i-]+a[n-k+i-];
tot=tot-a[i-]*a[i-]+a[n-k+i-]*a[n-k+i-];
ave=(sum*1.0)/(n-k);
double t=ave*ave*(n-k)+tot-*ave*sum;
ans=min(t,ans);
}
printf("%.9lf\n",ans);
}
return ;
}
最新文章
- Linux 定时任务
- ios 静态库冲突的解决办法
- [css]样式合并与模块化
- 在linux安装mysql,并设置远程访问
- Java for LeetCode 059 Spiral Matrix II
- LotteryDrawing
- unique踢出相同元素
- QCon2013上海站总结 -- 前端开发
- Qt的gzip模块实现
- UITableView中复用cell显示信息错乱
- 在ASP.NET MVC中对手机号码的验证
- 解决.net的堆碎片化带来的内存占用过大的问题
- JS 阻止整个网页的内容被选中
- 阅读http://zh.lucida.me/有感
- 深入理解Java虚拟机--上
- springboot 中页面跳转问题:window.location.href
- 【Selenium】【BugList10】smtp发送邮件问题汇总:550/535/554
- (转)python 全栈开发,Day74(基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询)
- go语言基础之获取命令行参数
- 双关键字LIS
热门文章
- [USACO18DEC]Balance Beam
- 【BZOJ3999】【TJOI2015】旅游 树剖
- 【BZOJ5294】[BJOI2018]二进制(线段树)
- A1142. Maximal Clique
- A1135. Is It A Red-Black Tree
- IOS11 底部输入框被手机输入法遮住
- windows中用bat脚本更改环境变量
- 第十五篇-EditText做简单的登录框
- pytest 3.fixture介绍一 conftest.py
- Codeforces Round #523 (Div. 2) C Multiplicity (DP)