[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 ;
}
[HAOI2006]均分数据的更多相关文章
- bzoj2428: [HAOI2006]均分数据
模拟退火.挺好理解的.然后res打成了ans一直WA一直WA...!!!一定要注意嗷嗷嗷一定要注意嗷嗷嗷一定要注意嗷嗷嗷. 然后我就一直卡一直卡...发现最少1800次的时候就可以出解了.然后我就去调 ...
- P2503 [HAOI2006]均分数据
P2503 [HAOI2006]均分数据 模拟退火+dp (不得不说,我今天欧气爆棚) 随机出1个数列,然后跑一遍dp统计 #include<iostream> #include<c ...
- bzoj 2428: [HAOI2006]均分数据 随机化
2428: [HAOI2006]均分数据 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...
- bzoj2428 [HAOI2006]均分数据 模拟退火
[HAOI2006]均分数据 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 3434 Solved: 1091[Submit][Status][Dis ...
- 洛谷 P2503 [HAOI2006]均分数据 随机化贪心
洛谷P2503 [HAOI2006]均分数据(随机化贪心) 现在来看这个题就是水题,但模拟赛时想了1个小时贪心,推了一堆结论,最后发现贪心做 不了, 又想了半个小时dp 发现dp好像也做不了,在随机化 ...
- 【BZOJ2428】[HAOI2006]均分数据
Description 已知N个正整数:A1.A2.…….An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: ,其中σ为均方差,是各组数据和的平均值,xi为第 ...
- 洛谷P2503 [HAOI2006]均分数据(模拟退火)
题目描述 已知N个正整数:A1.A2.…….An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: 输入输出格式 输入格式: 输入文件data.in包括: 第一行 ...
- BZOJ2428[HAOI2006]均分数据——模拟退火
题目描述 已知N个正整数:A1.A2.…….An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: ,其中σ为均方差,是各组数据和的平均值,xi为第i组数据的数值 ...
- [luogu2503][HAOI2006]均分数据【模拟退火】
题目描述 已知N个正整数:A1.A2.--.An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: 分析 模拟退火学习笔记:https://www.cnblogs ...
- BZOJ.2428.[HAOI2006]均分数据(随机化贪心/模拟退火)
题目链接 模拟退火: 模拟退火!每次随机一个位置加给sum[]最小的组. 参数真特么玄学啊..气的不想调了(其实就是想刷刷最优解) 如果用DP去算好像更准.. //832kb 428ms #inclu ...
随机推荐
- hdu_1028_Ignatius and the Princess III
Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...
- Ubuntu 16.04安装TortoiseSVN(基于CrossOver)
基于CrossOver的TortoiseSVN有如下缺点: 1.不能像Windows下实现右键菜单提交,但是可以通过TortoiseSVN实现迁出代码. 可以解决的问题: 1.可以通过Tortoise ...
- JSP的异常处理
以下内容引用自http://wiki.jikexueyuan.com/project/jsp/exception-handling.html: 当写JSP代码的时候,有可能会留下一个编码错误,并且它会 ...
- [转]一个完整的Installshield安装程序实例
@import url("http://files.cnblogs.com/files/go-jzg/vs.css"); --> Installshield安装程序实例—基本 ...
- Java正则表达式过滤出字母、数字和中文
原文:http://blog.csdn.net/k21325/article/details/54090066 1.Java中过滤出字母.数字和中文的正则表达式 (1)过滤出字母的正则表达式 [^(A ...
- 怎样把UCos-ii_在STM32上的移植
下载代码 stm32 标准外设库是 stm32 全系列芯片的外设驱动,有了它能够大大加速我们 开发 stm32. 首先从 st 公司的站点下载最新的 stm32 标准外设库,写本文时最新的版本号是 V ...
- Elasticsearch学习系列之mapping映射
什么是映射 为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成全文本(Full-text)或精确(Exact-value)的字符串值,Elasticsearch需要知道每个字段里面 ...
- Linux下完美使用find+grep实现全局代码搜索
作者:zhanhailiang 日期:2014-10-11 背景 在Window下有大量方便的图形化工具能够实现全局搜索,可是Linuxserver中因为使用命令行操作导致全局搜索是一个比較高的门槛. ...
- 中文分词实践(基于R语言)
背景:分析用户在世界杯期间讨论最多的话题. 思路:把用户关于世界杯的帖子拉下来.然后做中文分词+词频统计,最后将统计结果简单做个标签云.效果例如以下: 兴许:中文分词是中文信息处理的基础.分词之后.事 ...
- redux 调试工具
首先安装谷歌插件: redux-devtools 然后项目中安装插件:redux-devtools-extension 最后在创建 store 的时候进行配置: import { composeWit ...