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;
}