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

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

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

退火本身维护一个答案图像,答案的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. 数据结构学习之字符串匹配算法(BF||KMP)

    数据结构学习之字符串匹配算法(BF||KMP) 0x1 实验目的 ​ 通过实验深入了解字符串常用的匹配算法(BF暴力匹配.KMP.优化KMP算法)思想. 0x2 实验要求 ​ 编写出BF暴力匹配.KM ...

  2. 让自己的开源项目支持CocoaPods

    测试的时候找个自己封装的方法或UI控件就可以了 这里用我刚封装的Redirect重定向的请求体为例 1, 在github上创建一个Redirect,重要:记得选择开源协议 (MIT)(如果木有GitH ...

  3. springboot配置SSL自签名证书

    1.证书生成 每一个JDK或者JRE里都有一个工具,叫做:keytool,安装了jdk或jre之后,配置好JAVA环境之后,就可以直接在控制台使用该命令生成自签名证书: 在控制台输入: keytool ...

  4. 重写URL

    更新网页url /***省略部分代码***/ function rewriteUrl(url) { if (url.substr(0, 1) === "/") { url = (r ...

  5. MSMQ 和 MQTT

    MSMQ MicroSoft Message Queuing(微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任 ...

  6. xgboost 非官方每天编译

    xgboost  http://ssl.picnet.com.au/xgboost/ 非官方每天编译

  7. 小米Play获取ROOT权限的经验

    小米Play通过什么方式开通了Root权限?大家知道,android机器有Root权限,一旦手机开通了root相关权限,就能够实现更多的功能,举个栗子大家企业的营销部门,使用一些营销应用都需要在Roo ...

  8. shutil、zipfile,tarfile

    shutil 模块提供了大量的文件的高级操作.特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作. 1. shutil.copyfileobj(fsrc, fdst[, length]) 功 ...

  9. python的排序方式

    """ 冒泡排序: 冒泡排序的思想: 每次比较两个相邻的元素, 如果他们的顺序错误就把他们交换位置 比如有五个数: 12, 35, 99, 18, 76, 从大到小排序, ...

  10. FWT(快速沃尔什变换)小结

    在多项式卷积的处理中,我们实际上实现的是下面的一个式子 \[ C_k=\sum_{i+j=k}A_iB_j \] 然而事实上有些和(sang)蔼(xin)可(bing)亲(kuang)的出题人,并不会 ...