题解

今天下午刚学了模拟退火

借这个题来总结下模拟退火的要注意的问题吧

1 : \(eps\)不要设的太大

2 : 初温\(T\)在2000左右就差不多可以了

3 : 注意题目要求是要求最大值还是最小值,当x<0时\(exp(x)\)的取值范围才是\(0~1\)

4 : 可以在退完火以后再单独从当前最优答案下进行微调

5 : 可以进行多次退火

然后这题就是每次退火就是随机交换序列中的两个数,对序列DP一下就好了

题解

#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
const int M = 25 ;
const int N = 8 ;
const double INF = 1e50 ;
const double EPS = 1e-3 ;
using namespace std ;int n , m ;
int val[M] , e[M] ;
double f[N][M] , p[M] , Sum[M] ;
double bax , Ans = INF ;
inline double Rand() {return (double)((rand() % 101) / 100.0) ;
}
inline double F() {for(int i = 0 ; i <= m ; i ++)for(int j = 0 ; j <= n ; j ++) f[i][j] = INF ;f[0][0] = 0 ;for(int i = 1 ; i <= n ; i ++) Sum[i] = Sum[i - 1] + p[i] ;for(int i = 1 ; i <= m ; i ++)for(int j = i ; j <= n ; j ++)for(int k = i - 1 ; k < j ; k ++)f[i][j] = min(f[i][j] , f[i - 1][k] + (Sum[j] - Sum[k] - bax) * (Sum[j] - Sum[k] - bax)) ;if(f[m][n] < Ans) {Ans = f[m][n] ;for(int i = 1 ; i <= n ; i ++) e[i] = p[i] ;}return f[m][n] ;
}inline void Solve() {for(int i = 1 ; i <= n ; i ++) p[i] = e[i] ;double T = 2000 , W = 0.98 ;double NowAns , PreAns , dlt ;while(T > EPS) {PreAns = F() ;int a = rand() % n + 1 , b = rand() % n + 1 ;while(a == b) b = rand() % n + 1 ;swap(p[a],  p[b]) ;NowAns = F() ; dlt = NowAns - PreAns ;if(exp(-dlt / T) > Rand()) ;else  swap(p[a] , p[b]) ;T *= W ;}for(int i = 1 ; i <= 10000 ; i ++) {int a = rand() % n + 1 , b = rand() % n + 1 ;while(a == b) b = rand() % n + 1 ;swap(p[a] , p[b]) ;F() ;swap(p[a] , p[b]) ;}
}
int main() {srand(time(0)) ;cin >> n >> m ;for(int i = 1 ; i <= n ; i ++) {cin >> val[i] ;bax += val[i] ;p[i] = val[i] ;}bax /= m ; F() ;int Times = 20 ; while(Times--) Solve() ;printf("%.2lf\n",sqrt(Ans / m)) ;return 0 ;
}

转载于:https://www.cnblogs.com/beretty/p/10071905.html

[HAOI2006]均分数据相关推荐

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

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

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

    题目描述 已知N个正整数:A1.A2.--.An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: ,其中σ为均方差,是各组数据和的平均值,xi为第i组数据的数值 ...

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

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

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

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

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

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

  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. 如何在内存中存储有序数据?

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

  9. Hive数据连接与函数(2)

    1 数据连接 内连接:保留左表和右表连接成功的数据信息,连接未成功则不保留该数据 select * from hive_day03.orders as o join users u on o.user ...

最新文章

  1. Android 数据存储与IO (一)
  2. Truffle 4.0、Geth 1.7.2、TestRPC在私有链上搭建智能合约
  3. iphone震动反馈怎么设置_如何评价 iPhone 上的振动反馈?
  4. 作者:张慧(1984-),女,中国科学院软件研究所助理研究员
  5. 找零钱--C语言实现
  6. luks:Linux Unified Key Setup 持久加密USB
  7. Mac下搭建手机APP开发环境(HBuilder X ,HTML5plus Runtime,MUI,springboot)
  8. Jdbc -Statement
  9. mysql xp系统时间_【MySQL】时间函数
  10. 经纬度距离计算小工具_造价算量慢?70个造价史上最实用小工具和计算表格,速领...
  11. 类-描述器-把类对象方法转变为属性方式
  12. Cache和DMA一致性 iCache和dCache一致性
  13. 笔记本电脑网卡驱动损坏问题
  14. Mysql主从同步及主从同步延迟解决方案
  15. xodo pdf android,手机上最好用的pdf阅读器,没有之一——【Xodo】
  16. 微信公众号开发之iOS分享失败
  17. 拥有阿里云免费ssl证书后,如何部署
  18. 目标检测算法之AAAI2019 Oral论文GHM Loss
  19. 机器学习()PR曲线绘制
  20. 10大举措预防心脏病

热门文章

  1. 网易有道2017内推编程题
  2. 16线激光雷达配置教程
  3. 图的割点(边表集实现)
  4. PAI分布式机器学习平台编程模型演进之路
  5. [Node.js]DNS模块
  6. IE从服务器上获取json后转为下载提示的bug
  7. Asp.net page 绑定及访问数据
  8. 左耳朵耗子:程序员如何把控自己的职业?
  9. 震惊!原来这才是Kafka的“真面目”!
  10. 炸!业界难题,跨库分页的几种常见方案