Port 53

明日のための技術メモ

AtCoder ABC165

AtCoder ABC165解いた分だけまとめ。
今回はAB2完。Cは問題読んで紙に書き出したけどよくわからず、DのTLE解を出して終わった。 できなかったら素直に飛ばした方がいい。最近そんなことがままある気がする。

目次

解説AC

A. We Love Golf

f:id:saturn-glave:20200503004151p:plain

問題文

愚直に指定された距離の間で割り切れるか判定するだけ。
見つかったらexitして抜ける

ACしたコード

# coding:utf-8
k = int(input())
a, b = map(int, input().split())

for i in range(a, b + 1):
    if i % k == 0:
        print('OK')
        exit()

print('NG')

B. 1%

f:id:saturn-glave:20200503004248p:plain

問題文

while文を使って、指定された金額までmath.floorで切り捨てつつ、
年ごとの金額を計算するだけ

ACしたコード

# coding:utf-8
import math
x = int(input())
yen = 100
year = 0

while True:
    year += 1
    yen = math.floor(yen * 1.01)
    if yen >= x:
        break

print(year)

D. Floor Function

f:id:saturn-glave:20200503004445p:plain

問題文

愚直に実装すると当然TLE。
解説によると、f(x) = f(x+B) なのが代入すると分かる。
結果、xの範囲は0以上B-1以下に絞り込める。 BとNの大小関係は不明なので、x = B-1x = Nのうち小さい方が答え、らしい。

解説ACしたコード

# coding:utf-8

import math

a, b, n = map(int, input().split())
x = min(b - 1, n)

ans = math.floor((a * x) / b) - a * (math.floor(x / b))

print(ans)

TLEしたコード

# coding:utf-8

import math

a, b, n = map(int, input().split())
ans = 0

for x in range(1, n + 1):
    tmp = math.floor((a * x) / b) - a * (math.floor(x / b))
    ans = max(tmp, ans)

print(ans)