题意 这是一个关于“数字折叠”(即翻转数字并去除前导零)的问题。我们需要在区间 [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;
}