题意: 问[L,R]区间中的最大折叠数(折叠数指数字翻转,前边有0去掉0)

知识点: 分类讨论

思路: 其大致可以分为三种情况,L和R相等的,R为10^k形式的,和一般形式。

(1)L=R就直接无脑倒序输出去0即可

(2)R为10^k除非他是(1)情况,否则答案就是99...99(一共k位)因为L<R,首先保证位数最多,但是位数最多的这个倒过来只有1,所以往前取一个k个9是最大的,而L是个整数所以他只能<=k个9所以直接取k个9即可

(3)对于一般形式,我们想要先取到最多位数,所以直接和R的位数相等即可,因为除非是10^k的形式,哪怕是10001倒过来还是10001也比9999大,所以如果L和R的位数不等就可以直接把L变成n位最小数,(n是R的位数,假设n是5,n位最小数就是10000)接下来确定了位数在尝试构造最大折叠数,我举个例子进行讲解。

假设[L,R]是[6730000,6790000],接着我们顺序比较找到第一位不同的数字,而这一位不同也就代表着他后边的数字可以随意取,这个应该不用我多说,40000到50000肯定包括49999,所以我们直接可以默认后边全部取9,接着判断当前位,想要后边取9999且被包含,在这题中看就是89999才能被包含,所以这一位取8,也就是R[i]-1,只有在i-1到n位都是9才能包含比如这题R如果是6799999那他自然包括99999,所以可以取到,而前边的都是相同的数,就没什么需要确定的了,这样题目就解决了。最终我们取得6789999然后倒序输出就得到了我们的答案,

因为这题我差点就赛时开出来了,所以代码有点草,R是10^k形式的判断相当沟槽,然后就是关于个位的判断,我也懒得兼容,索性也把他单独举出来了,直接输出R即可,毕竟是个位数。

参考代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
	int t;
	cin >> t;
	while(t--){
		string l,r;
		cin >> l >> r;
		bool p=0;
		if(r[0]=='1')
			for(int i=1;i<(int)r.size();i++)
				if(r[i]!='0'){
					p=0;
					break;
				}
				else
					p=1;
		if(p&&l.compare(r)){
			for(int i=0;i<(int)r.size()-1;i++)
				cout << 9;
			cout << endl;
		}
		else if(r.size()==1){
			cout << r << endl;
		}
		else if(l.compare(r)==0){
			int i=(int)l.size()-1;
			while(l[i]=='0')i--;
			for(;i>=0;i--)
				cout << l[i];
			cout << endl;
		}
		else{
			if(l.size()<r.size()){
				l.clear();
				l.push_back('1');
				for(int i=1;i<(int)r.size();i++)
					l.push_back('0');
			}
			int i=0;
			bool f=1;
			while(i<(int)l.size()&&l[i]==r[i])i++;
			for(int j=0;j<(int)l.size()-i-1;j++)
				cout << 9;
			for(int j=(int)l.size()-1;j>=i+1;j--)
				if(r[j]!='9')
					f=0;
			for(int j=i;j>=0;j--)
				if(j!=i||f)
					cout << r[j];
				else
					cout << (char)(r[j]-1);
			cout << endl;
		}
	}
}