Largest Digit(思维题)

The 2023 ICPC Asia Jinan Regional Contest (The 2nd Universal Cup. Stage 17: Jinan)

D. Largest Digit


题意:

f ( x ) f(x) f(x) 是正整数 x x x 的十进制表示中的最大位数。例如, f ( 4523 ) = 5 f(4523) = 5 f(4523)=5 f ( 1001 ) = 1 f(1001) = 1 f(1001)=1

给定四个正整数 l a l_a la r a r_a ra l b l_b lb r b r_b rb ,使得 l a ≤ r a l_a \le r_a lara l b ≤ r b l_b \le r_b lbrb ,计算 f ( a + b ) f(a + b) f(a+b) 的最大值,其中 l a ≤ a ≤ r a l_a \le a \le r_a laara l b ≤ b ≤ r b l_b \le b \le r_b lbbrb

思路:

当第一个数和第二个数变化的时候,它们的和的个位上变化是很频繁的,个位上就很有可能得到最大的数 9 9 9,而高位就没这么有可能。

进一步研究发现,当一个数的个位可以取 0 ∼ 9 0\sim 9 09 的所有数,那么另一个数无论怎么变,我们都可以让它们的和的 个位 置为 9 9 9。也就是说,只要 r a − l a ≥ 9 r_a-l_a\ge 9 rala9 或者 r b − l b ≥ 9 r_b-l_b\ge 9 rblb9,那么我们就一定可以凑出个位是 9 9 9,它肯定是最大的。

剩余的情况第一个数和第二个数的取值是非常有限的,两数最多都只有 9 9 9 个取值,直接暴力枚举两个数的取值,然后验证就行了。

code:

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;

ll T,l1,r1,l2,r2;

ll f(ll x){
	ll ans=0;
	do{
		ans=max(ans,x%10);
		x/=10;
	}while(x);
	return ans;
}

int main(){
	cin>>T;
	while(T--){
		cin>>l1>>r1>>l2>>r2;
		if(r1-l1>=9 || r2-l2>=9){
			cout<<9<<endl;
		}
		else {
			ll ans=0;
			for(ll x=l1;x<=r1;x++)
				for(ll y=l2;y<=r2;y++)
					ans=max(ans,f(x+y));
			cout<<ans<<endl;
		}
	}
	return 0;
} 
  • 14
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值