洛谷P2503 [HAOI2006] 均分数据 题解 模拟退火
题目链接:https://www.luogu.com.cn/problem/P2503
模拟退火 + 贪心。
#include <bits/stdc++.h>
using namespace std;
int n, m, a[22], s[22], cnt[22];
double avga, ans = 1e9;
double cal() {
memset(s, 0, sizeof(int)*m);
memset(cnt, 0, sizeof(int)*m);
for (int i = 0; i < n; i++) {
int x = 0;
for (int j = 1; j < m; j++)
if (s[j] < s[x])
x = j;
s[x] += a[i];
cnt[x]++;
}
double sum = 0;
for (int i = 0; i < m; i++) {
double dx = (double) s[i] - avga;
sum += dx * dx;
}
sum = sqrt(sum / m);
ans = min(ans, sum);
return sum;
}
void sa() {
random_shuffle(a, a+n);
for (double t = 1e4; t >= 1e-4; t *= 0.993) {
double cur = cal();
int p = rand() % n, q = rand() % n;
if (p == q) continue;
swap(a[p], a[q]);
double tmp = cal();
double dt = tmp - cur;
if (exp(-dt / t) < (double) rand() / RAND_MAX) {
;
}
else
swap(a[p], a[q]);
}
}
int main() {
srand(time(NULL));
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) scanf("%d", a+i), avga += a[i];
avga /= m;
for (int i = 0; i < 500; i++)
sa();
printf("%.2lf\n", ans);
return 0;
}
三分天注定,七分靠人品。上面代码多提交几次,总还是能AC的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2020-08-18 洛谷P1410 子序列 题解 动态规划