単純に計算すると計算量多すぎるので、桁の条件を詰めつつ最大値を求める方法と二分探索がある。
目次
概要
の整数
を買いたい。
- 買うには、
円必要。(
は
の桁数)
円持ってるけど買える最大の
は?
解くときに考えた内容
全探索するとなので計算量を減らす必要がある。そこで以下の方法が考えられる。多くの人が二分探索でやっているので、主に違う方法やったものを扱う。
条件を満たす最大の桁における
を計算
が最大
の時、条件
(
は
の桁数)を満たしたら、
だったら、
- そうじゃなかったら、
の順に「桁ごとに」
を満たす最大の
を計算する
- 上記で最終的に最大の桁において、
の
で割った時の商が求めたい最大の
となる。
二分探索
単純に条件を満たすような
を見つける。(
は
の桁数)
コード
条件を満たす最大の桁における
を計算
a, b, x = map(int, input().split()) maxv = 0 if a * 10 ** 9 + b * 10 <= x: print(10**9) elif a + b > x: print(0) else: n = 10**0 while a * n + b * len(str(n)) <= x: maxv = (x-b*len(str(n))) // a if len(str(maxv)) != len(str(n)): maxv = n * 10 -1 # 桁ごとの最大のn # print(maxv) n *= 10 print(maxv)
二分探索
from bisect import bisect_right a, b, x = map(int, input().split()) # 二分探索 l = 0 r = 10 ** 9 + 1 while r - l > 1: n = (r+l) // 2 if a * n + b * len(str(m)) <= x: l = n else: r = n print(l)