25. CF-Half Queen Cover

题目链接:Half Queen Cover

很有趣的一个构造题。比赛的时候构造了一个小时也没做出来。

官方题解的解法非常巧妙。假设最后的答案是需要用 k 个棋子,在不考虑斜线的情况下控制了 a 行和 b 列,那么就会有 na 行和 nb 列没有被控制。这些区域就需要用斜线来填充。注意到这些区域最多形成 na+nb1 条斜线,所以可以列出不等式:

akbkna+nb1k

三个加起来,就是 2n13k,即 k=2n13

然后就是方案的构造,注意到 n2(mod3) 的时候可以整除,此时一种方案是在左上角将棋子放成一条斜线,在右下角将棋子放成一条斜线,如下图所示,中间的部分用斜向的攻击范围来覆盖:

00100000
01000000
10000000
000xxx00
000xxx00
000xxx00
00000001
00000010

其他两种情况由于需要向上取整,只需要在边角处放棋子转化成 n1 的情况再去填充即可。

#include <bits/stdc++.h>
using namespace std;
void solve() {
    int n;
    cin >> n;
    if (n <= 2) {
        cout << "1\n1 1" << endl;
        return;
    }
    int ans = 0, cnt = 0;
    while (n % 3 != 2) {
        n--;
        ans++, cnt++;
    }
    ans += 2 * (n / 3) + 1;
    cout << ans << endl;
    for (int i = 1; i <= cnt; ++i) {
        cout << n + i << ' ' << n + i << endl;
    }
    int k = n / 3;
    for (int i = 1; i < k + 2; ++i) {
        cout << i << ' ' << k + 2 - i << endl;
    }
    for (int i = n; i > n - k; --i) {
        cout << i << ' ' << 2 * n + 1 - k - i << endl;
    }
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int T = 1;
    // cin >> T;
    while (T--)
        solve();
}
posted @   Theophania  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示