Flying Cat Penguin

ゆるゆる仕事、ソフトウェアテスティング関連のことについて綴ります。

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)


以上