Python3で解く AtCoder Beginner Contest 146 C - Buy an Integer
単純に計算すると計算量多すぎるので、桁の条件を詰めつつ最大値を求める方法と二分探索がある。
目次
概要
- の整数を買いたい。
- 買うには、円必要。(はの桁数)
- 円持ってるけど買える最大のは?
解くときに考えた内容
全探索するとなので計算量を減らす必要がある。そこで以下の方法が考えられる。多くの人が二分探索でやっているので、主に違う方法やったものを扱う。
条件を満たす最大の桁におけるを計算
- が最大の時、条件(はの桁数)を満たしたら、
- だったら、
- そうじゃなかったら、の順に「桁ごとに」を満たす最大のを計算する
- 上記で最終的に最大の桁において、ので割った時の商が求めたい最大のとなる。
二分探索
単純に条件 を満たすような を見つける。(はの桁数)
コード
条件を満たす最大の桁におけるを計算
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)