考虑搜索,发现复杂度爆炸
       贪心,正确性过低(~~实测爆炸~~)

于是,~~发现~~这题是模拟退火

这里不讲解退火的定义了,初学退火可以去平衡点

退火本身维护一个答案图像,答案的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的更多相关文章

  1. 题解 洛谷P5018【对称二叉树】(noip2018T4)

    \(noip2018\) \(T4\)题解 其实呢,我是觉得这题比\(T3\)水到不知道哪里去了 毕竟我比较菜,不大会\(dp\) 好了开始讲正事 这题其实考察的其实就是选手对D(大)F(法)S(师) ...

  2. 题解 洛谷 P3396 【哈希冲突】(根号分治)

    根号分治 前言 本题是一道讲解根号分治思想的论文题(然鹅我并没有找到论文),正 如论文中所说,根号算法--不仅是分块,根号分治利用的思想和分块像 似却又不同,某一篇洛谷日报中说过,分块算法实质上是一种 ...

  3. 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)

    题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...

  4. 题解-洛谷P4229 某位歌姬的故事

    题面 洛谷P4229 某位歌姬的故事 \(T\) 组测试数据.有 \(n\) 个音节,每个音节 \(h_i\in[1,A]\),还有 \(m\) 个限制 \((l_i,r_i,g_i)\) 表示 \( ...

  5. 题解-洛谷P4724 【模板】三维凸包

    洛谷P4724 [模板]三维凸包 给出空间中 \(n\) 个点 \(p_i\),求凸包表面积. 数据范围:\(1\le n\le 2000\). 这篇题解因为是世界上最逊的人写的,所以也会有求凸包体积 ...

  6. 题解-洛谷P4859 已经没有什么好害怕的了

    洛谷P4859 已经没有什么好害怕的了 给定 \(n\) 和 \(k\),\(n\) 个糖果能量 \(a_i\) 和 \(n\) 个药片能量 \(b_i\),每个 \(a_i\) 和 \(b_i\) ...

  7. 题解-洛谷P5217 贫穷

    洛谷P5217 贫穷 给定长度为 \(n\) 的初始文本 \(s\),有 \(m\) 个如下操作: \(\texttt{I x c}\),在第 \(x\) 个字母后面插入一个 \(c\). \(\te ...

  8. 题解 洛谷 P2010 【回文日期】

    By:Soroak 洛谷博客 知识点:模拟+暴力枚举 思路:题目中有提到闰年然后很多人就认为,闰年是需要判断的其实,含有2月29号的回文串,前四位是一个闰年那么我们就可以直接进行暴力枚举 一些小细节: ...

  9. 题解 洛谷P2158 【[SDOI2008]仪仗队】

    本文搬自本人洛谷博客 题目 本文进行了一定的更新 优化了 Markdown 中 Latex 语句的运用,加强了可读性 补充了"我们仍不曾知晓得 消失的 性质5 ",加强了推导的严谨 ...

随机推荐

  1. windows 10隐藏各种文件夹

    1.windows键+R打开运行,或者Ctrl+Alt+Del键调出任务管理器--文件--运行新的任务,然后出入"regedit"打开注册表: 2.按目录找到:[-HKEY_CLA ...

  2. redis5.0.4多实例安装

    一.安装第一个实例 https://www.cnblogs.com/qq931399960/p/10584877.html 二.拷贝配置文件 cp /etc/redis.conf /etc/redis ...

  3. MySQL数据库聚合函数

    +++++++++++++++++++++++++++++++++++++++++++标题:MySQL数据库聚合函数时间:2019年2月25日内容:MySQL数据库聚合函数重点:MySQL数据库聚合函 ...

  4. dpdk-18.11网卡多队列RSS设置

    背景 最近在做将基于dpdk-16.11.1开发的程序,转移到基于dpdk-18.11版本下开发.遇到了网卡RSS配置的问题,在这里纪录一下. 问题 dpdk-16.11.1 在dpdk-16.11. ...

  5. 解决IOS微信浏览器底部会出现向前向后返回按钮,返回不刷新的问题

    <script type="text/javascript"> //解决IOS返回页面不刷新的问题 var isPageHide = false; window.add ...

  6. Python——汇总

    一.工具类 (1)pycharm激活.中文破解 (2)pycharm的基本设置 (3)pycharm常用包和插件的安装 二.数据类型 (1)列表.元祖.字典 操作方法 (2)迭代器操作方法 (3)生成 ...

  7. win10双系统安装卸载ubuntu

    安装 1. 官网下载需要安装的Ubuntu版本 2. 格式化U盘,用UltraISO软件将Ubuntu写入U盘 3. 设置电脑U盘启动,重启电脑安装,注意安装时关闭在线下载,否则会安装很久 4. 安装 ...

  8. Django学习目录

    Django学习目录 Django框架简介 Django基础 >>点我 ORM介绍 Django中ORM介绍 >>点我 ORM表操作 Django中ORM表相关操作 >& ...

  9. 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 ...

  10. day049--jQuery文档操作示例

    DOM操作(CRUD增改查删) 创建元素 $('span') // 创建一个span标签 后置插入操作   append(), appendTo() <!DOCTYPE html> < ...