A - Brick
,
のときは,
個の荷物を載せることができる(
個目を載せると
キログラムとなりオーバーする).
これを素直に式に表すと
となる(
は余りを表す).
従って,この計算の商の部分が答えになる.pythonでは切り捨て処理は//
で記述できる.
N, W = map(int,input().split()) print(N//W)
B - Blocks on Grid
ブロックを取り除くことしかできないので,すべてのマスの中でブロック数が一番少ないマスのブロック数に他のマスのブロック数を合わせるしかない.
おおむね次のような処理とした.
- 入力の1行ごとに,その行の最小値を保存するようにして,すべての入力が終わったあとで,それらの中から全体の最小値を取得
個の要素を走査し,その中で先の最小値との差を合計していく
H, W = map(int,input().split()) A = [] mins = [] for i in range(H): a = list(map(int,input().split())) A.append(a) mins.append(min(a)) ans = 0 m = min(mins) for i in range(H): for j in range(W): ans += A[i][j] - m print(ans)
C - Unlucky 7
少し難しかった.
各桁に7が出てくるかどうかのチェックが必要であり,それは整数型のままではできないので,文字列に変換して文字列の7を含むかどうかを判定する.
10進数については,ただ文字列に変換して上記の処理を行えばよい
8進数については,10進数を8進数に変換する処理が必要になる.
8進数への変換
実は,pythonには関数が用意されている(https://docs.python.org/ja/3/library/functions.html#oct). ただ,ここでは向学のため8進数への変換も実装することとする.
進数について
カンジをつかむ
そもそも10進数とはどのような数の表し方かを確認する.例えば2345(二千三百四十五)は
と書き直すことができる.
この各位の数
以外の部分に注目して
という形になっている.この部分が
なので
進法と呼んでいる.
では,8進数でと表されているという数は(10進数では)どのような数になるかというと,それは
となる.ちなみにこれを計算すると
である(もちろんこれは10進数).※
の右下の小さい
は,8進数で表していることを明示するためにつけている)
8進数を10進数に変換する
これで,8進数,10進数のカンジはつかめたのではないかと思うので,次は10進数で表された数を8進数に変換することを考える.
先のを8進数に変換することを考える.8進数での表記は
というかたまりを作れば良い.下の桁から順番に調べよう.一番下の桁は
となっており,
は
のいずれかである(もし
なら,繰り上がって,
の桁の方に出てくることになる).
したがって一番下の桁は,元の数字を8で割った余りを取ればよい.
となり,最下位桁は1とわかる.
次に下から2番目の桁を求める.今,最下位桁は「●●▲◆」の◆の部分を8で割った余りとして求めたので,次の桁は一番下の◆を切り落とした「●●▲」に対して8 で割った余りを求めればよい.この一番下の◆を切り落とす方法を考える.
実は簡単である.10進法で考えると,を
にするには,
で割って小数点以下を切り落とせばよい.ここで
で割ることで一番下の桁が落ちるのは10進数だからである.
したがって今は8進法で考えているのでで割って小数点以下を切り捨てれば目的のものが得られ,それを
で割った余りを求めればよい.
なので
とし,さらに
となり下から2番目の桁は5だとわかる.
あとはこれを繰り返せばよい.計算式のみ記す.
となり
となり
となり
となりここで終わり.
したがって,であることがわかった.これを実装すると次のようになる.
def to_oct(n): s = '' while(n): s = str(n%8) + s n //= 8 return s ans = 0 N = int(input()) for i in range(1,N+1): if '7' not in str(i) and '7' not in to_oct(i): ans += 1 print(ans)