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;
}
蒟蒻新手,分享欲来了,嘻嘻(´⊙ω⊙`)

京公网安备 11010502036488号