G题题解:
题目相关知识点:分类讨论+贪心
问题本质:要让一个数反转后的值最大,等价于让这个数的低位数字尽可能大。
直接遍历 [l, r],因为r可能很大遍历会超时
分类讨论:
- 直接取r的翻转值
- 逐位将r的某一位减1(该位>0),后面全置9,生成候选数,判断是否不小于L
代码演示:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 500010;
//翻转当前数x
int change(int x){
string str=to_string(x);
reverse(str.begin(),str.end());
return stoll(str);
}
void solve(){
int l,r;
cin>>l>>r;
int mval=-1;//初始化最小翻转值为-1
int tmp=change(r);//情况一,直接取r的翻转值
if(r>=l) mval=max(mval,tmp);
string s=to_string(r);//将r转化为字符串处理
//逐位减1,后面全置为9
for(int i=0;i<s.length();i++){
int p=s[i]-'0';
if(p>0){
string str=s;
str[i]=(char)(p-1+'0');
for(int j=i+1;j<s.length();j++){
str[j]='9';
}
int tmp=stoll(str);//将当前字符串转为数字,stoll自动忽略前导0
if(tmp>=l) mval=max(mval,tmp);//判断当前数字是否>=L,若是则更新最大值
}
}
cout<<mval<<endl;
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
int T=1;//cin>>T;
while(T--){
solve();
}
return 0;
}

京公网安备 11010502036488号