zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    43. VUE 脚手架 2 版本 新建项目过程
    42 VUE 脚手架 安装 和 基本使用(创建项目)【命令】
    JDBC 原始缺点分析 和 解决
    39-8 WEBPACK —— 搭建本地服务器
    39-7 WEBPACK — js压缩的Plugin
    14. SpringBoot 更换指定的 日志框架
    39-6 打包html的plugin
    39-5 插件 — 添加版权的Plugin
    【HDU 1027】Ignatius and the Princess II
    【洛谷 1896】互不侵犯_new
  • 原文地址:https://www.cnblogs.com/ccz181078/p/5295352.html
Copyright © 2011-2022 走看看