CF1393A Rainbow Dash, Fluttershy and Chess Coloring

思路

也只有我会来发这种水题了吧.

给定一个\(n\times n\)的方阵,每个格子上可以放两种颜色,每次只能在已经填好色的方格的四周(上下左右)填色,求使这个方阵变成颜色相间的棋盘的最小操作数。

一道结论题。

手推一下可以发现:

  1. \(n\)为奇数时,\(n+2\)的情况是\(n\)的情况的次数加\(1\)
  2. \(n+1\)的情况不会超过\(n+2\)的情况

又因为:

  • \(n=1\)时摆放的次数为\(1\)
  • \(n=2,3\)时摆放的次数为\(2\)
  • \(n=4,5\)时摆放的次数为\(3\)……

由此可以大胆的猜测答案就是\(\dfrac{\lfloor n+2\rfloor}{2}\),交上去测一发,发现的确是对的,在代码里即为\(n/2+1\)

那么我们就要想了,为什么是这样的呢?

其实就是因为在\(n\)的状态下进行一次摆放,尽可能摆放最多棋子的情况下,得到的就是\(n-2\)的情况下未摆放时的状态

以此类推,一直到\(n=1,2\)的情况,就可以一步步再倒着推回去了,这样的话这道题就做完了,最后给出代码。

代码

/*
Author:loceaner
*/
#include 
#include 
#include 
#include 
#include 
using namespace std;

const int A = 1e5 + 11;
const int B = 1e6 + 11;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;

inline int read() {
  char c = getchar();
  int x = 0, f = 1;
  for ( ; !isdigit(c); c = getchar()) if (c == '-') f = -1;
  for ( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
  return x * f;
}

int main() {
  int T = read();
  while (T--) {
    int n = read();
    cout << n / 2 + 1 << '\n';
  }
}

你可能感兴趣的:(CF1393A Rainbow Dash, Fluttershy and Chess Coloring)