题目描述

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

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

输入

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

输出

这一行只包含一个数,表示最小均方差的值(保留小数点后两位数字)。

样例输入

6 3
1 2 3 4 5 6

样例输出

0.00

提示

对于全部的数据,保证有K<=N <= 20,2<=K<=6

模拟退火,每次退火先将每个数随机分组,然后在降温过程中每次将一个数的所属分组改变,当答案更优时则保存改变,但当答案变劣时也有一定几率保存改变。最后将每次退火得到的最优解取最小值即可。

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
double a[100];
double sum[100];
int pos[100];
double avr;
double tmpans;
double ans=0x3fffffff;
int n,m;
void SA()
{memset(sum,0,sizeof(sum));for(int i=1;i<=n;i++){pos[i]=rand()%m+1;sum[pos[i]]+=a[i];}tmpans=0;for(int i=1;i<=m;i++){tmpans+=(sum[i]-avr)*(sum[i]-avr);}for(double T=10000;T>0.001;T*=0.98){int x=rand()%n+1;int block;double tmp=tmpans;if(T>500){block=min_element(sum+1,sum+1+m)-sum;}else{block=rand()%m+1;}if(pos[x]==block)continue;tmpans-=(sum[pos[x]]-avr)*(sum[pos[x]]-avr);tmpans+=(sum[pos[x]]-a[x]-avr)*(sum[pos[x]]-a[x]-avr);tmpans-=(sum[block]-avr)*(sum[block]-avr);tmpans+=(sum[block]+a[x]-avr)*(sum[block]+a[x]-avr);if(rand()%10000+1>T&&tmpans>tmp){tmpans=tmp;}else{sum[pos[x]]-=a[x];sum[block]+=a[x];pos[x]=block;}}ans=min(ans,tmpans);
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%lf",&a[i]);avr+=a[i];swap(a[i],a[rand()%i+1]);}avr/=(double)m;for(int i=1;i<=6000;i++){SA();}printf("%.2f\n",sqrt(ans/(double)m));
}

转载于:https://www.cnblogs.com/Khada-Jhin/p/10456964.html

BZOJ2428[HAOI2006]均分数据——模拟退火相关推荐

  1. [BZOJ2428] [HAOI2006]均分数据 模拟退火

    我真是*了狗了 随机数种子被卡了 我也是醉了 什么给T分段什么的 做几万次模拟退火什么的 根本想不到啊QAQ 一晚上就被这些鬼模拟退火虐过去了 #include<cstdio> #incl ...

  2. 洛谷P2503 [HAOI2006]均分数据(模拟退火)

    题目描述 已知N个正整数:A1.A2.--.An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: 输入输出格式 输入格式: 输入文件data.in包括: 第一行 ...

  3. BZOJ.2428.[HAOI2006]均分数据(随机化贪心/模拟退火)

    题目链接 模拟退火: 模拟退火!每次随机一个位置加给sum[]最小的组. 参数真特么玄学啊..气的不想调了(其实就是想刷刷最优解) 如果用DP去算好像更准.. //832kb 428ms #inclu ...

  4. [HAOI2006]均分数据

    题解 今天下午刚学了模拟退火 借这个题来总结下模拟退火的要注意的问题吧 1 : \(eps\)不要设的太大 2 : 初温\(T\)在2000左右就差不多可以了 3 : 注意题目要求是要求最大值还是最小 ...

  5. bzoj 2428: [HAOI2006]均分数据

    Description Solution 对于一种确定的排列,我们可以用 \(O(n^2*k)\) 的 \(DP\) 算出最优划分的方法 但是排列需要枚举,我们可以考虑退火 每一次交换两个元素,跑一边 ...

  6. excel数据平均分配给多人_excel表格 怎样均分数据-用Excel怎么才能将组数据平均分配给几个人...

    怎样在Excel表格中求平均数? 在excel中怎样自动生成各班各科的平均成绩 可以调用Excel函数库的函实现. 步骤如下: 1.  在单元格内点击上公式-平均值". 2.  点击需要参与 ...

  7. 重走长征路---OI每周刷题记录---12月6日 2014

    总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...

  8. AcWing进阶算法课Level-4 第六章 搜索 (模拟退火,爬山)

    AcWing进阶算法课Level-4 第六章 搜索 模拟退火 AcWing 3167. 星星还是树110人打卡 AcWing 2424. 保龄球78人打卡 AcWing 2680. 均分数据72人打卡 ...

  9. 如何在内存中存储有序数据?

    目前有很多种不同的数据结构可以在内存中存储有序的数据.在分布式数据库的存储引擎中,有一种结构因其简单而被广泛地使用,那就是跳表(SkipList). 跳表的优势在于其实现难度比简单的链表高不了多少,但 ...

最新文章

  1. SQL LEFT JOIN 关键字
  2. {dede:list}和{dede:arclist}的区别
  3. Dapr集成之GRPC 接口
  4. linux mysql 写shell_Linux—编写shell脚本操作数据库执行sql
  5. mysql数字前面有0_Mysql中前边有0的数据,0会被舍去的问题
  6. Docker之Docker网络讲解
  7. QT每日一练day29:QT中的多线程探究
  8. 1)关于配置centos的网络问题
  9. 恒拓开源携开源中国有望于 10 月底挂牌新三板
  10. DNN群宗旨--QQ群(DNN山海经):56782274
  11. NS2中认知无线电仿真
  12. Windows中的NTUSER.DAT文件是什么?
  13. 2023南京大学计算机考研信息汇总
  14. 服务器受到DDOS攻击怎么办
  15. 第二周 Ubuntu的简单介绍与使用
  16. Basler 多个网口相机出图(SDK版)
  17. 为什么大家都喜欢买白色的汽车
  18. FTP文件传输协议(英文:File Transfer Protocol,缩写:FTP)
  19. 使用CNN进行ROI提取(优化代码篇)
  20. 专访金岩石:大部分人买不起房是正常现象

热门文章

  1. Android学习笔记---Material Design设计理念
  2. shell清除日志小脚本
  3. GopherChina 2018 区块链+容器+Go底层实现
  4. 除了eWTP试验区,阿里云还要在马来西亚部署全球第15座数据中心
  5. 用户头像设置之ios版本
  6. 消息队列系列(三):.Rabbitmq Trace的使用
  7. AutoCAD VBA:过三点创建一个圆
  8. EditText 长按弹出的上下文菜单
  9. oracle Database 10g后:闪回表
  10. 经过不断努力 终于获得“推荐博客”的荣誉