HDU5073
来源:互联网 发布:linux 安装 pv 编辑:程序博客网 时间:2024/06/05 08:57
题意:给定n个数轴上的点xi,di是xi到中心mid的距离,可以移动K个到中心mid,求 wi*di^2的和的最小值。
因为wi是1,所以我们可以简化成下面的公式:
I=min(sum(di^2))
=min(sum(xi-mid)^2)
=min(sum(xi^2-2*xi*mid+mid^2)
=min(sum(xi^2) - 2*mid*sum(xi^2) + mid^2) sum下标(0~(n-k))
用前缀和维护xi^2和xi ,时间复杂度是o(n).
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define maxn 50005double x[maxn]; //注意一定是double,如果是int会WA.int main(){ // freopen("in.txt", "r", stdin); int T, k, i, j, n; double mid, sum1, sum2, ans; scanf("%d", &T); while(T--) { sum1 = sum2 = 0; scanf("%d%d", &n, &k); for(i = 0; i < n; i++) scanf("%lf", &x[i]); ans = 0; if(n != k) { sort(x, x+n); for(i = 0; i < n-k; i++) { sum1 += x[i]*x[i]; sum2 += x[i]; } mid = sum2/(n-k); ans = sum1 - 2*mid*sum2 + mid*mid*(n-k); for(i = 1, j = n-k; j < n; i++, j++) { sum1 -= x[i-1]*x[i-1]; sum1 += x[j]*x[j]; sum2 -= x[i-1]; sum2 += x[j]; mid = sum2/(n-k); ans = min(ans, (sum1 - 2*mid*sum2 + mid*mid*(n-k))); } } printf("%.10f\n", ans); } return 0;}
0 0
- HDU5073
- hdu5073
- hdu5073 Galaxy(暴力)
- hdu5073 贪心 + 公式拆解
- hdu5073 数学化简
- hdu5073-思维&方差-Galaxy
- hdu5073 -- 贪心(2014西安现场赛)
- 2014鞍山现场赛D题 E题||hdu5073、5074
- HDU5073 ACM-ICPC亚洲区域赛鞍山赛区现场赛D题 Galaxy 贪心+数学推导
- 2014 Asia AnShan Regional Contest D题Galaxy(数学)(hdu5073)
- hibernate - 原理
- CodeForces 10D. LCIS 最长公共上升子序列模板题 + 打印路径
- Java虚拟机对对象的几种引用方式
- kruskal求生成树的扩展
- uboot移植----lowlevel_init.s分析
- HDU5073
- Android SERVICE后台服务进程的守护
- qgis 插件开发
- 如何使用开源library?(Android)
- 大型网站系统架构的演化
- 句柄和指针
- 中小软件企业与高校合作的模式探索
- 开发工程师人生之路
- Git的入门级玩法