本题虽然说给定了l1,r1,l2,r2,让从两个区间各选一个数,使加和的数位和最大,这个题等价于从l=l1+l2到r=r1+r2选择一个数使其数位和最大。最大的数取决于r值,让r的后面几位是九就是这个题的思路。例如,r=14783,如果后四位是9,则为9999,后三位为九,则为13999,后两位为九,则为14699,最后一位为九,则为14779,在和r本身一起(极端情况,如r=99999),看谁的数位和最大。(注意:如果l,r数位不等的话可以忽略l,l的长度变为r的长度,然后l都为零就可以了,如果r的某一位是零,则跳过“后缀变成九”的部分)
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
int T;
cin>>T;
while(T--)
{
int l1,r1,l2,r2;cin>>l1>>r1>>l2>>r2;
int l=l1+l2,r=r1+r2;
string sl=to_string(l);
string sr=to_string(r);
int lenl=sl.size(),lenr=sr.size();
int ans=0,res=0;
if(lenl!=lenr)sl.assign(lenr,'0');
for(int i=0;i<lenr;i++)
{
if(sl[i]<sr[i])
{
int tmp=(lenr-(i+1))*9+(sr[i]-'0'-1)+res;//后面是9,加上自身减一,加上前面
ans=max(ans,tmp);
}
res+=sr[i]-'0';
}
ans=max(ans,res);
cout<<ans<<endl;
}
return 0;
}