hdu 5073 Galaxy(2014acm鞍山亚洲分部 C)

简介:

主题链接:http://acm.hdu.edu.cn/showproblem.php?

pid=5073

Galaxy

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 768    Accepted Submission(s): 179
Special Judge


Problem Description
Good news for us: to release the financial pressure, the government started selling galaxies and we can buy them from now on! The first one who bought a galaxy was Tianming Yun and he gave it to Xin Cheng as a present.


To be fashionable, DRD also bought himself a galaxy. He named it Rho Galaxy. There are n stars in Rho Galaxy, and they have the same weight, namely one unit weight, and a negligible volume. They initially lie in a line rotating around their center of mass.

Everything runs well except one thing. DRD thinks that the galaxy rotates too slow. As we know, to increase the angular speed with the same angular momentum, we have to decrease the moment of inertia.

The moment of inertia I of a set of n stars can be calculated with the formula


where w i is the weight of star i, d i is the distance form star i to the mass of center.

As DRD’s friend, ATM, who bought M78 Galaxy, wants to help him. ATM creates some black holes and white holes so that he can transport stars in a negligible time. After transportation, the n stars will also rotate around their new center of mass. Due to financial pressure, ATM can only transport at most k stars. Since volumes of the stars are negligible, two or more stars can be transported to the same position.

Now, you are supposed to calculate the minimum moment of inertia after transportation.
 

Input
The first line contains an integer T (T ≤ 10), denoting the number of the test cases.

For each test case, the first line contains two integers, n(1 ≤ n ≤ 50000) and k(0 ≤ k ≤ n), as mentioned above. The next line contains n integers representing the positions of the stars. The absolute values of positions will be no more than 50000.
 

Output
For each test case, output one real number in one line representing the minimum moment of inertia. Your answer will be considered correct if and only if its absolute or relative error is less than 1e-9.
 

Sample Input

  
  
2 3 2 -1 0 1 4 2 -2 -1 1 2
 

Sample Output

  
  
0 0.5
 

Source
 

Recommend
liuyiding   |   We have carefully selected several similar problems for you:   5081  5080  5079  5077  5076 
 

Statistic |  Submit |  Discuss |  Note


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 50100
using namespace std;
int T,N,K;
int pos[MAXN],sum[MAXN],x[MAXN],First,Last;
double DL,DR,mass;
int PL,PR,need;
double ans,NowI;
double GetNext(){
    double ret=NowI;
    double pmass=mass;
    mass=(sum[Last+1]-sum[First]+0.0)/need;
    NowI+=-(pmass-pos[First])*(pmass-pos[First])+(mass-pos[Last+1])*(mass-pos[Last+1]);
    NowI+=(mass-pmass)*(mass-pmass)*(need-1);
    DL-=(pmass-pos[First]);
    Last++;First++;
    int t=PL-First+1;
    NowI+=2*DL*(mass-pmass);
    DL+=(mass-pmass)*t;
    PL++;
    while(PL<=N && pos[PL]<=mass){
        DL+=fabs(mass-pos[PL]);
        DR-=fabs(pmass-pos[PL]);
        NowI+=(mass-pos[PL])*(mass-pos[PL]);
        NowI-=(pmass-pos[PL])*(pmass-pos[PL]);
        NowI-=(mass-pmass)*(mass-pmass);
        PL++;
    }
    NowI+=2*(pmass-mass)*DR;
    DR+=(pos[Last]-mass);
    PL--;
    DR-=(mass-pmass)*(Last-(PL+1));
    return NowI;
}
int main(){
//    freopen("in.txt","r",stdin);
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&N,&K);
        for(int i=0;i<N;i++)
            scanf("%d",&pos[i]);
        sort(pos,pos+N);
        sum[0]=pos[0];
        for(int i=1;i<N;i++)
            sum[i]=sum[i-1]+pos[i];
        need=N-K;ans=0;PL=0;
        if(N==1 || need <2 ){
            puts("0.000000000000");
            continue;
        }
        double kkk=sum[need-1]*1.0/need;First=0;Last=need-1;
        DL=0;PL=0;DR=0;NowI=0;
        for(int i=0;i<need;i++){
            NowI+=(kkk-pos[i])*(kkk-pos[i]);
            if(pos[i]<=kkk){
                PL=i;
                DL+=(kkk-pos[i]);
            }
            else
                DR+=(pos[i]-kkk);
        }
        mass=kkk;
        ans=NowI;
        while(Last<N-1){
            GetNext();
            ans=min(ans,NowI);
        }
        printf("%.12lf\n",ans);
    }
}




本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5040853.html,如需转载请自行联系原作者


相关文章
|
缓存 NoSQL 安全
玩转Redis!非常强大的Redisson分布式集合,少写60%代码
Redisson是Java的Redis客户端,提供实时数据平台服务,简化了分布式环境下的数据管理。它包含RList、RSet、RMap等分布式集合,支持ConcurrentMap和Set接口,确保线程安全和数据一致性。例如,RMap实现了本地缓存和监听器功能,允许数据监听和本地加速读取。此外,还提供了RSet的排序和去重功能,以及RQueue和RBlockingQueue等队列实现,支持阻塞操作。通过Redisson,开发者能轻松处理分布式系统的数据同步和操作。
|
网络协议 程序员 网络性能优化
动图图解 | UDP就一定比TCP快吗?
动图图解 | UDP就一定比TCP快吗?
241 0
|
Java
Java中Bean与Map之间相互转换工具类
Java中Bean与Map之间相互转换工具类
323 0
|
JSON 数据格式
helm 将yaml文件转换json的插件helm-schema-gen
helm 将yaml文件转换json的插件helm-schema-gen
|
4天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1111 2
|
3天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
571 10
|
13天前
|
人工智能 运维 安全
|
4天前
|
弹性计算 Kubernetes jenkins
如何在 ECS/EKS 集群中有效使用 Jenkins
本文探讨了如何将 Jenkins 与 AWS ECS 和 EKS 集群集成,以构建高效、灵活且具备自动扩缩容能力的 CI/CD 流水线,提升软件交付效率并优化资源成本。
305 0

热门文章

最新文章