E题题解
(最简方法,运行最快,不需要特判,不需要算法,只有一个for循环!)
首先 与
取数发现可以遍历
+
+
所有数,
令 +
、
+
,问题转化为在
取一个数。
举例一个 、
:
-
贪心考虑从高位往低位看,如果
、
对应数位值相等,没有办法,只能取这个值,现在
。
-
一直到不等的地方,例子中百位
、
,如果我们的
百位为
,那么最后三位数最大位数和为
+
+
;但如果退一步选
,那么最后三位数最大位数和为
+
+
。观察琢磨发现,在
、
不等的地方,将
数位降
,后面的数位全选
。
-
发现
和
这样的临界值我们取不到,之前我们的
总会小于
,那么不妨让
加上一个
完美解决问题。
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll T=1,l1,r1,l2,r2,l,r,ans;
void solve(){
cin>>l1>>r1>>l2>>r2;ans=0;
l=l1+l2,r=r1+r2+1;
for(ll i=18,j=1000000000000000000;i>=0;i--,l%=j,r%=j,j/=10)//从第18位计算
if(l/j==r/j) ans+=r/j;
else{
ans+=r/j-1+9*i;
break;
}
cout<<ans;puts("");
}int main(){cin>>T;while(T--) solve();}