[HAOI2006]均分数据
题解
今天下午刚学了模拟退火
借这个题来总结下模拟退火的要注意的问题吧
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]均分数据相关推荐
- 洛谷P2503 [HAOI2006]均分数据(模拟退火)
题目描述 已知N个正整数:A1.A2.--.An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: 输入输出格式 输入格式: 输入文件data.in包括: 第一行 ...
- BZOJ2428[HAOI2006]均分数据——模拟退火
题目描述 已知N个正整数:A1.A2.--.An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: ,其中σ为均方差,是各组数据和的平均值,xi为第i组数据的数值 ...
- BZOJ.2428.[HAOI2006]均分数据(随机化贪心/模拟退火)
题目链接 模拟退火: 模拟退火!每次随机一个位置加给sum[]最小的组. 参数真特么玄学啊..气的不想调了(其实就是想刷刷最优解) 如果用DP去算好像更准.. //832kb 428ms #inclu ...
- bzoj 2428: [HAOI2006]均分数据
Description Solution 对于一种确定的排列,我们可以用 \(O(n^2*k)\) 的 \(DP\) 算出最优划分的方法 但是排列需要枚举,我们可以考虑退火 每一次交换两个元素,跑一边 ...
- [BZOJ2428] [HAOI2006]均分数据 模拟退火
我真是*了狗了 随机数种子被卡了 我也是醉了 什么给T分段什么的 做几万次模拟退火什么的 根本想不到啊QAQ 一晚上就被这些鬼模拟退火虐过去了 #include<cstdio> #incl ...
- excel数据平均分配给多人_excel表格 怎样均分数据-用Excel怎么才能将组数据平均分配给几个人...
怎样在Excel表格中求平均数? 在excel中怎样自动生成各班各科的平均成绩 可以调用Excel函数库的函实现. 步骤如下: 1. 在单元格内点击上公式-平均值". 2. 点击需要参与 ...
- 重走长征路---OI每周刷题记录---12月6日 2014
总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...
- 如何在内存中存储有序数据?
目前有很多种不同的数据结构可以在内存中存储有序的数据.在分布式数据库的存储引擎中,有一种结构因其简单而被广泛地使用,那就是跳表(SkipList). 跳表的优势在于其实现难度比简单的链表高不了多少,但 ...
- Hive数据连接与函数(2)
1 数据连接 内连接:保留左表和右表连接成功的数据信息,连接未成功则不保留该数据 select * from hive_day03.orders as o join users u on o.user ...
最新文章
- Android 数据存储与IO (一)
- Truffle 4.0、Geth 1.7.2、TestRPC在私有链上搭建智能合约
- iphone震动反馈怎么设置_如何评价 iPhone 上的振动反馈?
- 作者:张慧(1984-),女,中国科学院软件研究所助理研究员
- 找零钱--C语言实现
- luks:Linux Unified Key Setup 持久加密USB
- Mac下搭建手机APP开发环境(HBuilder X ,HTML5plus Runtime,MUI,springboot)
- Jdbc -Statement
- mysql xp系统时间_【MySQL】时间函数
- 经纬度距离计算小工具_造价算量慢?70个造价史上最实用小工具和计算表格,速领...
- 类-描述器-把类对象方法转变为属性方式
- Cache和DMA一致性 iCache和dCache一致性
- 笔记本电脑网卡驱动损坏问题
- Mysql主从同步及主从同步延迟解决方案
- xodo pdf android,手机上最好用的pdf阅读器,没有之一——【Xodo】
- 微信公众号开发之iOS分享失败
- 拥有阿里云免费ssl证书后,如何部署
- 目标检测算法之AAAI2019 Oral论文GHM Loss
- 机器学习()PR曲线绘制
- 10大举措预防心脏病