[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 ...
随机推荐
- SPOJ NSUBSTR (后缀自动机)
SPOJ NSUBSTR Problem : 给一个长度为n的字符串,要求分别输出长度为1~n的子串的最多出现次数. Solution :首先对字符串建立后缀自动机,在根据fail指针建立出后缀树,对 ...
- Ubuntu 16.04硬盘有坏道,开机显示blk_update_request:I/0 error
可以尝试以下方式解决: 1.检查坏道(效果明显,但是比较慢,检查出来并没有什么用,只是知道有坏块) sudo badblocks -s -v -o /root/bb.log /dev/sda1 2.快 ...
- apache.commons.lang.StringUtils 使用心得
原文:http://blog.csdn.net/ye_sheng/article/details/48101901?ref=myread 在Java中我们用的最多的类应该就是String了.对于Str ...
- maven打包插件maven-shade-plugin简单介绍
作用: 1.可以把依赖打入jar包,然后直接使用这个jar包,从而不用担心依赖问题 2.通过设置MainClass,创建一个可以执行的jar包 3.Java工程经常会遇到第三方 Jar 包冲突,使用 ...
- Django学习系列之captcha 验证码插件
安装部署 安装captcha pip3. install django-simple-captcha== settings.py中引入captcha INSTALLED_APPS = [ 'djang ...
- bzoj3190【JLOI2013】赛车
3190: [JLOI2013]赛车 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1445 Solved: 454 [Submit][Statu ...
- POJ 1159 Palindrome(字符串变回文:LCS)
POJ 1159 Palindrome(字符串变回文:LCS) id=1159">http://poj.org/problem? id=1159 题意: 给你一个字符串, 问你做少须要 ...
- Microsoft Windows CE 5.0 Board Support Package, Boot Loader, and Kernel Startup Sequence
Summary Learn about the initial, low-level startup sequence and the hardware platform functions that ...
- debug 和release 的区别
http://blog.csdn.net/h_wlyfw/article/details/26688677
- DNNClassifier 深度神经网络 分类器
An Example of a DNNClassifier for the Iris dataset. models/premade_estimator.py at master · tensorfl ...