G题,刚开始找规律的时候一直纠结于每隔10个数的短暂单调性,但是后来发现很多特殊情况,WA到崩溃。

后来使用贪心思维去想:一般情况下,这个最大的翻转数通常以……9999的形式结尾,在位数相同的情况下结尾的9越多越大,怎么构造……9999结尾呢?向前借位嘛,从前到后遍历r的每一位,只要是本位大于0的就把本位-1,前面不变,后面都变成9

由于还要考虑范围l,变化的这个数要看是不是在范围内,枚举完即可得到正确答案

#include <bits/stdc++.h>
#define ll long long
using namespace std;

ll get_fold_num(ll i) { //返回一个数的翻转数
    string num=to_string(i);
    int j=num.size()-1;
    while(j>0&&num[j]=='0')j--;
    string ans;
    for(;j>=0;j--)ans+=num[j];
    return stoll(ans);
}

void solve() {
    string l,r;
    cin>>l>>r;
    
    ll ans=get_fold_num(stoll(r)),lv=stoll(l);
    for(int i=0;i<r.size();i++){   //枚举位数
        string c=r;
        if(r[i]>'0'){
            c[i]-=1;
            for(int j=i+1;j<r.size();j++)c[j]='9';
            ll t=stoll(c);
            if(t>=lv)ans=max(ans,get_fold_num(t));  //看看是不是在范围里
        }
    }
    cout<<ans<<'\n';
    return;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T;
    cin >> T;
    while (T--) {
        solve();
    }
    return 0;
}

蒟蒻新手,分享欲来了,嘻嘻(´⊙ω⊙`)