• bzoj2428 均分数据


    Description

    已知N个正整数:A1A2、……、An 。今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小。均方差公式如下:

    ,其中σ为均方差,是各组数据和的平均值,xi为第i组数据的数值和。

    Input

    第一行是两个整数,表示N,M的值(N是整数个数,M是要分成的组数)
    第二行有N个整数,表示A1、A2、……、An。整数的范围是1--50。
    (同一行的整数间用空格分开)

    Output

    这一行只包含一个数,表示最小均方差的值(保留小数点后两位数字)。
    首先任取一个初始的分组方案,进行两种随机调整操作并模拟退火确定是否进行:

    1.随机在一个非空组中选出一个数放入另一组中

    2.随机选两个不同组中的数并交换位置

    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    int n,m;
    int v[24];
    int s[24][24],sp[24],sum[24];
    double Ans=1e20;
    double calc(){
        double x=0,ans=0;
        for(int i=0;i<m;i++)x+=sum[i];
        x/=m;
        for(int i=0;i<m;i++)ans+=(sum[i]-x)*(sum[i]-x);
        if(ans<Ans)Ans=ans;
        return ans;
    }
    void run(double k){
        double v=calc();
        double l=1024;
        int a,b,c,c2,d;
        while(l>1){
            a=rand()%m,b=rand()%m;
            if(a==b||!sp[a])continue;
            c=rand()%sp[a],c2,d=s[a][c];
            sum[a]-=d;sum[b]+=d;
            double v1=calc();
            if(v1<v||(rand()&1023)<l){
                s[b][sp[b]++]=d;
                s[a][c]=s[a][--sp[a]];
                v=v1;
            }else sum[a]+=d,sum[b]-=d;
            
            a=rand()%m,b=rand()%m;
            if(a==b||!sp[a]||!sp[b])continue;
            c=rand()%sp[a],c2=rand()%sp[b],d=s[a][c]-s[b][c2];
            sum[a]-=d;sum[b]+=d;
            v1=calc();
            if(v1<v||(rand()&1023)<l){
                int x=s[b][c2];
                s[b][c2]=s[a][c];
                s[a][c]=x;
                v=v1;
            }else sum[a]+=d,sum[b]-=d;
            
            l*=k;
        }
    }
    int main(){
        srand(1844677);
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++)scanf("%d",v+i);
        for(int i=0;i<n;i++)s[i%m][sp[i%m]++]=v[i],sum[i%m]+=v[i];
        for(int i=0;i<1000;i++)run(0.95);
        for(int i=0;i<2000;i++)run(0.92);
        for(int i=0;i<2000;i++)run(0.9);
        for(int i=0;i<1000;i++)run(0.8);
        printf("%.2lf",sqrt(Ans/m));
        return 0;
    }
  • 相关阅读:
    如何复制word的图文到UMEditor中自动上传
    如何复制word的图文到百度编辑器中自动上传
    如何复制word的图文到百度ueditor中自动上传
    java实现大文件上传源码
    java实现大文件上传控件
    java实现大文件上传组件
    java实现大文件上传插件
    html 常用标签及基本用法
    Web最佳实践阅读总结(1)
    基于DevOps理论与人工智能技术的银行业务可用性管控
  • 原文地址:https://www.cnblogs.com/ccz181078/p/5295352.html
Copyright © 2020-2023  润新知