1 条题解
-
0
题意翻译
给定一个整数 ()。要求找到最小的非负整数 ,使得 和 的十进制表示中至少有一个相同的数字。
例如:, 满足条件(都有数字 ),且没有更小的 满足条件。关键观察
- 任何多位数 (即 )必然有一个最高位数字 ()或者某个数位上的数字 。
如果 出现在 中,那么一位数 本身就满足条件,且 。 - 因此,最优的 必定是一位数(即 )。
- 我们只需要找出 的十进制表示中包含的最小数字( 到 ),将其作为 输出即可。
算法步骤
对每个测试用例:
- 读入整数 。
- 提取 的每一位数字,用一个布尔数组
has[0..9]记录哪些数字出现过。 - 从 到 遍历,找到第一个
has[d] == true的数字,输出该数字。
复杂度分析
- 每个 最多有 位(因为 ),提取数字 。
- 查找最小数字最多检查 次。
- 总复杂度 ,,完全可行。
正确性证明
- 充分性:若 是 的某一位数字,则 与 共享数字 ,因此满足条件。
- 最小性:假设存在更小的非负整数 满足条件。由于 是 中出现的最小数字,任何小于 的非负整数只能由比 更小的数字组成(如 以及它们的组合)。但这些数字都没有在 中出现过(因为 是最小出现数字),因此 不可能与 有公共数字。矛盾。故 是最小的可行 。
代码实现
#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- :数字 ,最小为 ,输出 。
- :数字 ,最小为 ,输出 。
- :数字 ,最小为 ,输出 。
- :数字 ,最小为 ,输出 。
- :数字 ,最小为 ,输出 。
与题目示例输出完全一致。
- 任何多位数 (即 )必然有一个最高位数字 ()或者某个数位上的数字 。
- 1
信息
- ID
- 6643
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者