[luogu2503][HAOI2006]均分数据【模拟退火】
题目描述
已知N个正整数:A1、A2、……、An 。今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小。均方差公式如下:
分析
模拟退火学习笔记:https://www.cnblogs.com/chhokmah/p/10529114.html
万物皆可颓火,我们首先将初始的答案当做一半一半的答案,然后我们随机化抽取两个部分的数据。根据题目中的描述,因为两个组别之间数据个数只能是差一,那么差不多就是一半一半的情况。那么我们就只需要分块两部分,然后随机交换,如果两个数据交换之后能使答案能更优,那么就交换,如果不能让我们的答案变得更加优,那么就让随机概率,这个概率很明显是越到后面交换的概率越小,那么我们就是exp(delta) < t * Rand()
,那么就交换,否则就不交换。
模拟退火的精髓还是这个调参,这道题目我一遍A掉了,感觉有一点欧皇。
我给出一个比较优秀的随机种子,是ouhuang和6666666的取模,就是15346301。
ac代码
#include <bits/stdc++.h>
#define ms(a,b) memset(a, b, sizeof(a))
#define db double
using namespace std;
inline char gc() {
static char buf[1 << 16], *S, *T;
if (S == T) {
T = (S = buf) + fread(buf, 1, 1 << 16, stdin);
if (T == S) return EOF;
}
return *S ++;
}
template <typename T>
inline void read(T &x) {
T w = 1;
x = 0;
char ch = gc();
while (ch < '0' || ch > '9') {
if (ch == '-') w = -1;
ch = gc();
}
while (ch >= '0' && ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = gc();
x = x * w;
}
template <typename T>
void write(T x) {
if (x < 0) putchar('-'), x = -x;
if (x > 9) write(x / 10);
putchar(x % 10 + 48);
}
#define N 305
db ans = 1e30, ave = 0;
int sum[N], pos[N], a[N];
int n, m;
void SA(db T){
ms(sum, 0);
for (int i = 1; i <= n; i ++) {
pos[i] = rand() % m + 1;
sum[pos[i]] += a[i];
}
db res = 0;
for (int i = 1; i <= m; i ++)
res += (1.0 * sum[i] - ave) * (1.0 * sum[i] - ave);
while (T > 1e-4) {
int t = rand() % n + 1, x = pos[t], y;
if (T > 500) y = min_element(sum + 1, sum + 1 + m) - sum;
else y = rand() % m + 1;
if (x == y) continue;
db tmp = res;
res -= (sum[x] - ave) * (sum[x] - ave);
res -= (sum[y] - ave) * (sum[y] - ave);
sum[x] -= a[t], sum[y] += a[t];
res += (sum[x] - ave) * (sum[x] - ave);
res += (sum[y] - ave) * (sum[y] - ave);
if (res < tmp || rand() % 10000 <= T) pos[t] = y;
else sum[x] += a[t], sum[y] -= a[t], res = tmp;
ans = min(ans, res);
T *= 0.98;
}
}
int main() {
srand(20040127);
read(n); read(m);
for (int i = 1; i <= n; i ++) {
read(a[i]);
ave += 1.0 * a[i];
}
ave /= 1.0 * m;
for (int i = 1; i <= 1500; i ++) SA(10000);
printf("%.2lf\n", sqrt(ans / m));
return 0;
}
[luogu2503][HAOI2006]均分数据【模拟退火】的更多相关文章
- bzoj2428 [HAOI2006]均分数据 模拟退火
[HAOI2006]均分数据 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 3434 Solved: 1091[Submit][Status][Dis ...
- 洛谷P2503 [HAOI2006]均分数据(模拟退火)
题目描述 已知N个正整数:A1.A2.…….An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: 输入输出格式 输入格式: 输入文件data.in包括: 第一行 ...
- BZOJ2428[HAOI2006]均分数据——模拟退火
题目描述 已知N个正整数:A1.A2.…….An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: ,其中σ为均方差,是各组数据和的平均值,xi为第i组数据的数值 ...
- HAOI2006 均分数据 [模拟退火]
题目描述 已知N个正整数:A1.A2.--.An .今要将它们分成M组,使得各组数据的数值和最平均,即各组的均方差最小.均方差公式如下: 输入输出格式 输入格式: 输入文件data.in包括: 第一行 ...
- BZOJ 2428 JZYZOJ1533 : [HAOI2006]均分数据 模拟退火 随机化
http://www.lydsy.com/JudgeOnline/problem.php?id=2428 http://172.20.6.3/Problem_Show.asp?id=1533 http ...
- P2503 [HAOI2006]均分数据
P2503 [HAOI2006]均分数据 模拟退火+dp (不得不说,我今天欧气爆棚) 随机出1个数列,然后跑一遍dp统计 #include<iostream> #include<c ...
- bzoj2428: [HAOI2006]均分数据
模拟退火.挺好理解的.然后res打成了ans一直WA一直WA...!!!一定要注意嗷嗷嗷一定要注意嗷嗷嗷一定要注意嗷嗷嗷. 然后我就一直卡一直卡...发现最少1800次的时候就可以出解了.然后我就去调 ...
- 洛谷 P2503 [HAOI2006]均分数据 随机化贪心
洛谷P2503 [HAOI2006]均分数据(随机化贪心) 现在来看这个题就是水题,但模拟赛时想了1个小时贪心,推了一堆结论,最后发现贪心做 不了, 又想了半个小时dp 发现dp好像也做不了,在随机化 ...
- bzoj 2428: [HAOI2006]均分数据 随机化
2428: [HAOI2006]均分数据 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...
随机推荐
- echarts使用笔记二:柱子堆叠
1.多个柱子堆叠效果,多用于各部分占比 app.title = '坐标轴刻度与标签对齐'; option = { title : { //标题 x : 'center', y : 5, text : ...
- Tomcat web.xml配置参数详解
Apache Tomcat Configuration Reference - The Context Containerhttps://tomcat.apache.org/tomcat-5.5-do ...
- 关于Fatal error: Paletter image not supported by webp 报错
报错提示 Fatal error: Paletter image not supported by webp 原因是由于图片被非法编辑过(相对PHP来说)造成, 有可能是某些编辑图片的软件的格式与PH ...
- [转帖]CS、IP和PC寄存器
https://www.cnblogs.com/zhuge2018/p/8466288.html 之前的理解不对 当然了 现在的理解也不太对.. CS.IP和PC寄存器 CS寄存器和IP寄存器: 首先 ...
- [转帖]NotePad++编辑Linux中的文件
NotePad++编辑Linux中的文件 https://blog.csdn.net/chengqiuming/article/details/78882692 原作者 未经允许不允许转帖 加密自己参 ...
- eclipse打开package explorer视图
第一步:window-show view-other 第二步:
- php变量详解
变量是用于存储信息的"容器". 定义一个变量的语法: $变量名 = 值; 使用变量的例子: <?php $x=5; $y=6; $z=$x+$y; echo $z; ?> ...
- rbac组件引用
一. 批量操作思路 # 待新增 路由系统中有,但是数据库中还没有 路由系统的集合 - 数据库中权限集合 # 待更新 路由系统中有,数据库中也有, 只是更改了一些信息 路由系统的集合 & 数据库 ...
- npm 设置代理
设置代理 npm config set proxy http://username:password@server:portnpm config set https-proxy http://user ...
- Python——Label控件说明
Anchor : 标签中文本的位置: background(bg)foreground(fg) :背景色:前景色: borderwidth(bd) :边框宽度: width .height ...