1 条题解
-
0
📝 题目大意
给定正整数 ,在所有满足 ( 表示 的各位数码之和)的正整数 中,求 的最大值 ,以及使得 的最小 。
💡 解题思路
-
题目分析:核心是研究"乘以 2"对数码和的影响。当 逐位乘以 2 时,若某一位产生进位(),会导致该位的数码和贡献比"无进位"少 9。因此 ,等号成立当且仅当所有位都不产生进位,即 的每一位数字都 。
-
算法推导:
- 求 :既然 且我们可以通过让 只含数字 来达到 (无进位),所以 。
- 求 :在"每一位 "的约束下,为了最小化 的数值,需要位数尽可能少(即每位尽可能大)。最大允许的数字是 ,因此贪心地用尽可能多的 来凑 :
- 令 ,其中 。
- 若 , 为 后面接 个 。
- 若 , 为 个连续的 。
- 此构造与
std.cpp完全一致:先输出余数 (如果非零),再循环输出 个 。
-
边界与细节:
- 当 较小时(如 ), 就是 本身,无 后缀。
- 当 是 的倍数时, 全是 ,没有前导余数。
- 结果可能极大( 时 有 25 位),需用字符串或直接输出,不能用 64 位整数存储。
std.cpp中逐位cout输出,避免了溢出问题。
⏱️ 复杂度分析
- 时间复杂度:。输出 是 ,输出 最多输出 个数字,即 个字符。
- 空间复杂度:。仅使用常数个变量
n,x。
💻 标准代码 (C++)
#include<bits/stdc++.h> using namespace std; int main(){ int n; cin >> n; // M_max = 2N:无进位时 f(2x) 达到理论上界 int x = (n / 4) * 8 + (n % 4) * 2; // 等价于 2 * n cout << x << '\n'; // 构造最小 x:先输出余数 r(1/2/3),再输出 q 个 4 if (n % 4) cout << n % 4; // 输出高位余数位 while (n >= 4) { cout << 4; // 每位 4 保证无进位且位数最少 n -= 4; } return 0; } -
信息
- ID
- 874
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者