1 条题解

  • 0
    @ 2026-4-22 15:40:55

    题意翻译

    给定一个整数 xx1x10001 \le x \le 1000)。要求找到最小的非负整数 yy,使得 xxyy 的十进制表示中至少有一个相同的数字。
    例如:x=96x=96y=6y=6 满足条件(都有数字 66),且没有更小的 yy 满足条件。

    关键观察

    • 任何多位数 yy(即 y10y \ge 10)必然有一个最高位数字 dd1d91 \le d \le 9)或者某个数位上的数字 dd
      如果 dd 出现在 xx 中,那么一位数 dd 本身就满足条件,且 d<yd < y
    • 因此,最优的 yy 必定是一位数(即 0y90 \le y \le 9)。
    • 我们只需要找出 xx 的十进制表示中包含的最小数字(0099),将其作为 yy 输出即可。

    算法步骤

    对每个测试用例:

    1. 读入整数 xx
    2. 提取 xx 的每一位数字,用一个布尔数组 has[0..9] 记录哪些数字出现过。
    3. 0099 遍历,找到第一个 has[d] == true 的数字,输出该数字。

    复杂度分析

    • 每个 xx 最多有 44 位(因为 x1000x \le 1000),提取数字 O(logx)O(\log x)
    • 查找最小数字最多检查 1010 次。
    • 总复杂度 O(tlogx)O(t \cdot \log x)t1000t \le 1000,完全可行。

    正确性证明

    • 充分性:若 ddxx 的某一位数字,则 y=dy=dxx 共享数字 dd,因此满足条件。
    • 最小性:假设存在更小的非负整数 y<dy' < d 满足条件。由于 ddxx 中出现的最小数字,任何小于 dd 的非负整数只能由比 dd 更小的数字组成(如 0,1,,d10,1,\dots,d-1 以及它们的组合)。但这些数字都没有在 xx 中出现过(因为 dd 是最小出现数字),因此 yy' 不可能与 xx 有公共数字。矛盾。故 dd 是最小的可行 yy

    代码实现

    #include <bits/stdc++.h>
    using namespace std;
    
    void solve() {
        int x;
        cin >> x;
        bool has[10] = {false};
        // 提取每一位
        int tmp = x;
        while (tmp > 0) {
            has[tmp % 10] = true;
            tmp /= 10;
        }
        // 找最小出现的数字
        for (int d = 0; d <= 9; ++d) {
            if (has[d]) {
                cout << d << '\n';
                return;
            }
        }
    }
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int t;
        cin >> t;
        while (t--) solve();
        return 0;
    }
    

    示例验证

    输入:

    5
    6
    96
    78
    122
    696
    
    • x=6x=6:数字 {6}\{6\},最小为 66,输出 66
    • x=96x=96:数字 {9,6}\{9,6\},最小为 66,输出 66
    • x=78x=78:数字 {7,8}\{7,8\},最小为 77,输出 77
    • x=122x=122:数字 {1,2}\{1,2\},最小为 11,输出 11
    • x=696x=696:数字 {6,9}\{6,9\},最小为 66,输出 66

    与题目示例输出完全一致。

    • 1

    信息

    ID
    6643
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    1
    已通过
    1
    上传者