AtCoder 参加日記#1
AtCoderを細々やっていこうかなと思い立って、実装したものの記録を残します。
参加コンテスト
- diverta 2019 Programming Contest
内容
A OK
# -*- coding: utf-8 -*- # スペース区切りの整数の入力 a, b = map(int, input().split()) # 出力 print(a-b+1)
B 時間切れ
# -*- coding: utf-8 -*- # スペース区切りの整数の入力 r, g, b, n = map(int, input().split()) # 最大の数をそれぞれ求める max_x = (int)(n / r) max_y = (int)(n / g) max_z = (int)(n / b) # 答えの数 answer_num = 0 # 計算 for x in reversed(range(max_x+1)): for y in reversed(range(max_y+1)): if x*r+y*g > n: continue for z in range(max_z+1): if x*r+y*g+z*b > n: continue elif x*r+y*g+z*b == n: answer_num += 1 else: pass # 出力 print(answer_num)
C 未着手
D 未着手
E 未着手
F 未着手
解説
https://img.atcoder.jp/diverta2019/editorial.pdf
所感
- for文を単純に回したら時間切れになるので注意する
- 余分な計算や判定をさせないようにあらかじめ数式を組んでおく
- スマートじゃなくてごめんなさい…精進します。
とある方の回答を見て手直ししたBの回答
# -*- coding: utf-8 -*- # スペース区切りの整数の入力 r, g, b, n = map(int, input().split()) # 答えの数 answer_num = 0 # 計算 for x in reversed(range(int(n / r) + 1)): for y in reversed(range(int(n - x*r/g) + 1)): if ((n - (x*r + y*g))% b) == 0 and (n - (x*r + y*g)) >= 0: answer_num += 1 # 出力 print(answer_num)
以上