关于S T1
  • 板块学术版
  • 楼主__er
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/10/24 22:25
  • 上次更新2023/11/2 11:30:57
查看原帖
关于S T1
713955
__er楼主2023/10/24 22:25

听到好多人骂 n≤8n\le 8 暴力无脑过

这样先考虑对于第一个状态求出对应的 8181 种符合条件的密码,然后再 O(n)O(n) 暴力判每一个密码

大概是 O(n)O(n) 带约 4×1024\times 10^2 的常数

这样开到 n≤104n\le 10^4 是完全没问题的,不过也只是个暴力,这个题目本身决定了这就是一道噗叽题,只是 n≤8n\le 8 引导更多的人打了暴力而已,我不相信 S 组的选手会想不到这样几乎无脑的优化

这份代码是过了洛谷的自测,其他的没测,顺手写的

#include <bits/stdc++.h>
#include <bits/extc++.h>
int n, a[9][6], p[82][6], tot, dif, ans;
bool f;
bool check(int t[]) {
    for (int i = 2; i <= n; i++) {
        dif = 0, f = false;
        for (int j = 1; j <= 5; j++)dif += (a[i][j] != t[j]);
        if (dif == 1)continue;
        if (dif != 2)return false;
        for (int j = 1; j <= 5; j++)if (a[i][j] != t[j] && a[i][j + 1] != t[j + 1] && (t[j] - a[i][j] + 10) % 10 == (t[j + 1] - a[i][j + 1] + 10) % 10) {f = true; break;}
        if (!f)return false;
    }
    return true;
}
signed main() {
    std::ios::sync_with_stdio(false), std::cin.tie(nullptr), std::cout.tie(nullptr);
    std::cin >> n;
    for (int i = 1; i <= n; i++)for (int j = 1; j <= 5; j++)std::cin >> a[i][j];
    for (int i = 1; i <= 81; i++)for (int j = 1; j <= 5; j++)p[i][j] = a[1][j];
    for (int i = 1; i <= 9; i++) {
        for (int j = 1; j <= 5; j++)p[++tot][j] += i, p[tot][j] %= 10;
        for (int j = 1; j <= 4; j++)p[++tot][j] += i, p[tot][j + 1] += i, p[tot][j] %= 10, p[tot][j + 1] %= 10;
    }
    for (int i = 1; i <= 81; i++)ans += check(p[i]);
    return std::cout << ans, 0;
}
2023/10/24 22:25
加载中...