P8431 题解
liangbowen · · 题解
前言
题目传送门!
更好的阅读体验?
这题题解都写得特别复杂,蒟蒻看不懂。因此,我补一篇简单的贪心题解。
思路
题目等同于求最小的
若
保证了
因此,我们可以贪心地枚举
如何构造
- 对于每个
i ,让第i 位的数加一,自然进位。 - 第
[i+1, len(p)-1] 位均变为0 。 - 第
len(p) 位变为1 ,因为末尾不可以是0 。
显而易见,这样构造出的数
因此,我们直接取
听起来有些晦涩难懂,代码实现实际比较简单。
总时间复杂度
代码实现
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long LL;
int LEN(LL n) //计算 n 的位数。
{
int cnt = 0;
while (n) cnt++, n /= 10;
return cnt;
}
LL f(LL n) //如题的 f(x) 函数。
{
LL ans = 0;
while (n) ans = ans * 10 + (n % 10), n /= 10;
return ans;
}
void solve()
{
LL n, minn = 9e18;
scanf("%lld", &n);
int len = LEN(n);
for (int i = 0; i <= len; i++)
{
LL p = pow(10, (LL)i); //第 i 位加一。
LL ni = n - (n % p) + p; //后面的位全部变成 0。
if (ni % 10 == 0) ni++; // 最后一位变成 1。
minn = min(minn, f(ni));
//printf("ni = %lld;\n", f(ni));
}
printf("%lld\n", minn - 1);
}
int main()
{
int T;
scanf("%d", &T);
while (T--) solve();
return 0;
}
希望能帮助到大家!