题解 洛谷P3936 Coloring
考虑搜索,发现复杂度爆炸
贪心,正确性过低(~~实测爆炸~~)
于是,~~发现~~这题是模拟退火
这里不讲解退火的定义了,初学退火可以去平衡点
退火本身维护一个答案图像,答案的q,当前图像,当前的q
暴力根据计算图像计算q即可
关于这题我们发现如果任由其随机,可能会导致偏差太大
但如果过多修正偏差,可能导致其跃出局部最优解的能力降低
于是我加了这么一句话
if (curq - ansq >= (temp * 90)){
for (ri i = 1; i <= n; ++i)
for (ri j = 1; j <= m; ++j)
cur_map[i][j] = ans_map[i][j];
curq = ansq;
}
即根据当前温度及时修正偏差,温度越高,偏差容忍度越高
最后放个代码(不保证一直AC)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define ll long long
#define ri register int const double DEL = 0.00001;
const double DELTA = 0.99999; inline ll read(){
ll x = 0; int zf = 1; char ch = ' ';
while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
if (ch == '-') zf = -1, ch = getchar();
while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); return x * zf;
} int n, m, c;
int ansq;
int ans_map[25][25];
int curq;
int cur_map[25][25];
int p[25]; inline void swp(int x1, int y1, int x2, int y2){
int t = cur_map[x1][y1];
cur_map[x1][y1] = cur_map[x2][y2];
cur_map[x2][y2] = t;
} inline int getQ(int x1, int y1, int x2, int y2){
int res = 0;
swp(x1, y1, x2, y2);
for (ri i = 1; i <= n; ++i)
for (ri j = 1; j <= m; ++j){
if (i < n)
if (cur_map[i][j] != cur_map[i+1][j])
++res;
if (j < m)
if (cur_map[i][j] != cur_map[i][j+1])
++res;
}
swp(x1, y1, x2, y2);
return res;
} void SA(){
register double temp = 10000.0;
int x1, y1, x2, y2;
int excq;
while (temp >= DEL){
x1 = (rand() % n) + 1, y1 = (rand() % m) + 1, x2 = (rand() % n) + 1, y2 = (rand() % m) + 1;
srand(rand());
excq = getQ(x1, y1, x2, y2);
if (excq < ansq){
curq = ansq = excq;
swp(x1, y1, x2, y2);
for (ri i = 1; i <= n; ++i)
for (ri j = 1; j <= m; ++j)
ans_map[i][j] = cur_map[i][j];
}
else if (exp(-(excq - ansq) / temp) * RAND_MAX > ((rand() % 1000000) / 1000000.0)){
curq = excq;
swp(x1, y1, x2, y2);
}
else{
if (curq - ansq >= (temp * 90)){
for (ri i = 1; i <= n; ++i)
for (ri j = 1; j <= m; ++j)
cur_map[i][j] = ans_map[i][j];
curq = ansq; } }
temp *= DELTA;
}
} int main(){
srand(19260817);
srand(rand()); srand(rand()); srand(rand());
n = read(), m = read(), c = read();
for (ri i = 1; i <= c; ++i)
p[i] = read();
int k1 = 1, k2 = 1;
for (ri i = 1; i <= n; ++i)
for (ri j = 1; j <= m; ++j){
ans_map[i][j] = cur_map[i][j] = k1;
++k2;
if (k2 > p[k1]){
++k1;
k2 = 1;
}
}
ansq = 0;
for (ri i = 1; i <= n; ++i)
for (ri j = 1; j <= m; ++j){
if (i < n)
if (cur_map[i][j] != cur_map[i+1][j])
++ansq;
if (j < m)
if (cur_map[i][j] != cur_map[i][j+1])
++ansq;
}
SA();
for (ri i = 1; i <= n; ++i)
for (ri j = 1; j <= m; ++j){
printf("%d", ans_map[i][j]);
if (j < m)
printf(" ");
else
printf("\n");
}
return 0;
}
题解 洛谷P3936 Coloring的更多相关文章
- 题解 洛谷P5018【对称二叉树】(noip2018T4)
\(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...
- 题解 洛谷 P3396 【哈希冲突】(根号分治)
根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...
- 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)
题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...
- 题解-洛谷P4229 某位歌姬的故事
题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...
- 题解-洛谷P4724 【模板】三维凸包
洛谷P4724 [模板]三维凸包 给出空间中 \(n\) 个点 \(p_i\),求凸包表面积. 数据范围:\(1\le n\le 2000\). 这篇题解因为是世界上最逊的人写的,所以也会有求凸包体积 ...
- 题解-洛谷P4859 已经没有什么好害怕的了
洛谷P4859 已经没有什么好害怕的了 给定 \(n\) 和 \(k\),\(n\) 个糖果能量 \(a_i\) 和 \(n\) 个药片能量 \(b_i\),每个 \(a_i\) 和 \(b_i\) ...
- 题解-洛谷P5217 贫穷
洛谷P5217 贫穷 给定长度为 \(n\) 的初始文本 \(s\),有 \(m\) 个如下操作: \(\texttt{I x c}\),在第 \(x\) 个字母后面插入一个 \(c\). \(\te ...
- 题解 洛谷 P2010 【回文日期】
By:Soroak 洛谷博客 知识点:模拟+暴力枚举 思路:题目中有提到闰年然后很多人就认为,闰年是需要判断的其实,含有2月29号的回文串,前四位是一个闰年那么我们就可以直接进行暴力枚举 一些小细节: ...
- 题解 洛谷P2158 【[SDOI2008]仪仗队】
本文搬自本人洛谷博客 题目 本文进行了一定的更新 优化了 Markdown 中 Latex 语句的运用,加强了可读性 补充了"我们仍不曾知晓得 消失的 性质5 ",加强了推导的严谨 ...
随机推荐
- windows 10隐藏各种文件夹
1.windows键+R打开运行,或者Ctrl+Alt+Del键调出任务管理器--文件--运行新的任务,然后出入"regedit"打开注册表: 2.按目录找到:[-HKEY_CLA ...
- redis5.0.4多实例安装
一.安装第一个实例 https://www.cnblogs.com/qq931399960/p/10584877.html 二.拷贝配置文件 cp /etc/redis.conf /etc/redis ...
- MySQL数据库聚合函数
+++++++++++++++++++++++++++++++++++++++++++标题:MySQL数据库聚合函数时间:2019年2月25日内容:MySQL数据库聚合函数重点:MySQL数据库聚合函 ...
- dpdk-18.11网卡多队列RSS设置
背景 最近在做将基于dpdk-16.11.1开发的程序,转移到基于dpdk-18.11版本下开发.遇到了网卡RSS配置的问题,在这里纪录一下. 问题 dpdk-16.11.1 在dpdk-16.11. ...
- 解决IOS微信浏览器底部会出现向前向后返回按钮,返回不刷新的问题
<script type="text/javascript"> //解决IOS返回页面不刷新的问题 var isPageHide = false; window.add ...
- Python——汇总
一.工具类 (1)pycharm激活.中文破解 (2)pycharm的基本设置 (3)pycharm常用包和插件的安装 二.数据类型 (1)列表.元祖.字典 操作方法 (2)迭代器操作方法 (3)生成 ...
- win10双系统安装卸载ubuntu
安装 1. 官网下载需要安装的Ubuntu版本 2. 格式化U盘,用UltraISO软件将Ubuntu写入U盘 3. 设置电脑U盘启动,重启电脑安装,注意安装时关闭在线下载,否则会安装很久 4. 安装 ...
- Django学习目录
Django学习目录 Django框架简介 Django基础 >>点我 ORM介绍 Django中ORM介绍 >>点我 ORM表操作 Django中ORM表相关操作 >& ...
- CF271D 【Good Substrings】
定义哈希函数 \(H(c)=\sum_{i = 1} ^ m c_i*b^{m-i}\) \(H(C,K+1)=H(C,K)*b+C_{K+1}\)(K个坏字母) 用long long #includ ...
- day049--jQuery文档操作示例
DOM操作(CRUD增改查删) 创建元素 $('span') // 创建一个span标签 后置插入操作 append(), appendTo() <!DOCTYPE html> < ...