1 条题解
-
0
📝 题目大意
给定非负整数 和操作次数 ,依次对 执行操作:将 四舍五入到最近的 的倍数,若距离相等则取较大的那个。输出最终结果。
💡 解题思路
-
题目分析:
- ,,数据范围较小,模拟即可。
- 每一步的舍入单位是 ,即对第 位(从 开始)进行四舍五入。
- 注意 最大可能达到 ,需要 64 位整数(
long long)。
-
算法推导:
- 对于第 步( 从 开始),舍入单位 。
- 设 (下界倍数),(上界倍数)。
- 当 即 时, 更靠近 ,向下舍入为 ;否则向上舍入为 。
- 注意 时,,不等式不成立,走
else分支取 ,满足"距离相等时取较大值"的要求。 - 循环 次,每次更新 ,最后输出 。
-
边界与细节:
- 时,无论 多大,,,,始终取 ,结果恒为 。
- 当 足够大使得 时, 会被舍入为 (如样例 2:)。
- 使用
long long避免溢出,pow(10, i+1)返回double,在 时精度足够。
⏱️ 复杂度分析
- 时间复杂度:,每次迭代 ,。
- 空间复杂度:,仅使用常数个变量。
💻 标准代码 (C++)
#include<bits/stdc++.h> using namespace std; #define int long long // 数据范围可能超过 32 位,统一使用 long long signed main() { int n, k; scanf("%lld%lld", &n, &k); for (int i = 0; i < k; i++) { int x = pow(10, i + 1); // 第 i 步的舍入单位:10^{i+1} int a = n / x * x; // 下界:不大于 n 的最近 x 的倍数 int b = n / x * x + x; // 上界:a + x if (n * 2 < a + b) // n 更靠近 a,向下舍入 n = a; else // n 更靠近 b 或等距,向上舍入 n = b; } printf("%lld\n", n); return 0; } -
- 1
信息
- ID
- 645
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者