题意 这是一个关于“数字折叠”(即翻转数字并去除前导零)的问题。我们需要在区间 [l,r] 中对每个整数 i 计算其折叠数,然后找出所有折叠数中的最大值。
核心思想
最大折叠数一定出现在 r 或某个形如 (r / p) * p - 1 的数上,其中 p = 10, 100, 1000, ... 这些数就是:把 r 的最后 1 位、2 位、3 位……全部变成 9 所能得到的不超过 r 的最大候选数。
例如: 若 r = 54321
p = 10 → c = (54321/10)10 - 1 = 543210 - 1 = 54319
p = 100 → c = 543*100 - 1 = 54299
p = 1000 → c = 54*1000 - 1 = 53999
p = 10000 → c = 5*10000 - 1 = 49999
p = 100000 → c = 0*100000 - 1 = -1(退出)
这些 c 就是所有“高位与 r 相同或略小,低位全为 9”的候选数,极有可能产生最大的折叠数,因为末尾的 9 反转后会变成开头的 9,使折叠数很大。 同时,一旦 c < l,更小的 p(更大的位数被置为 9)只会让 c 更小,所以可以 break。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll rev(ll x) {
ll res=0;
while (x) {
res=res*10+x%10;
x/=10;
}
return res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
int T;
cin>>T;
while (T--) {
ll l,r;
cin>>l>>r;
ll x=rev(r);
ll p=10;
while (true) {
ll c=(r/p)*p-1;
if (c<l) break;
x=max(x,rev(c));
p*=10;
}
cout<<x<<"\n";
}
return 0;
}

京公网安备 11010502036488号