1 条题解
-
0
📝 题目大意
给定整数 (),在所有满足 的正整数对 中,求 的各位数字之和与 的各位数字之和的最小值。
💡 解题思路
-
题目分析:核心是十进制加法中进位与数字和的关系。设 表示 的十进制各位数字之和。两个数相加时,每发生一次进位,总数字和会减少 (因为 进到高位变成 ,净损失 )。因此有恒等式:
其中 为 过程中产生的进位次数。要最小化 ,等价于最小化进位次数 。
-
算法推导:
- 理想情况:零进位。如果能够构造一对 使得加法过程中不发生任何进位,则 ,这是理论下界。对于绝大多数 ,这是可以做到的:只需将 的每一位数字 拆分为 (),并保证 和 各自至少有一位非零(即 均为正数)。例如 ,,。
- 特殊情况:。此时 是 的幂(如 ),其十进制表示仅有一个 后面跟若干 。由于只有一位非零数字且为 ,无论怎么拆分,都无法让 和 同时为正且不进位——若把 分给 , 全为 则 不合法。因此至少需要发生一次进位,。
- 结论:先计算 的数字和
ans,若ans == 1则输出10,否则直接输出ans。
-
边界与细节:
- 时数字和为 , 即得答案 ,正确。
- 时输出 ,如样例 输出 。
- 数据范围 ,
int足够,无溢出风险。
⏱️ 复杂度分析
- 时间复杂度:,即 的十进制位数,每次循环提取一位数字。对于 ,最多 次迭代。
- 空间复杂度:,仅使用常数个变量。
💻 标准代码 (C++)
#include<bits/stdc++.h> using namespace std; int main(){ int n, a[100000], ans = 0; // ans 累加各位数字和 cin >> n; while (n) { ans += n % 10; // 取最低位数字累加 n /= 10; // 去掉最低位 } if (ans == 1) ans += 9; // 数字和为 1 说明 N 是 10 的幂,必须进位一次 cout << ans; return 0; } -
- 1
信息
- ID
- 848
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者