【AtCoder】ABC331解説(Python)

大和証券プログラミングコンテスト2023(AtCoder Beginner Contest 331)の解説記事です。

目次

ABC331 A – Tomorrow

問題

問題文の要約は以下の通りです。

問題の要約

1年が \(M\) ケ月、1ケ月が \(D\) 日からなるとき、\(y\) 年 \(m\) 月 \(d\) 日の翌日は何年何月何日か求めよ。

制約

・\(1000 \le y \le 9000\)
・\(1 \le m \le M \le 99\)
・\(1 \le d \le D \le 99\)
・入力は全て整数である

入力

\(M\) \(D\)
\(y\) \(m\) \(d\)

出力

答えの年、月、日を空白区切りで出力せよ。

解説

年末や月末かそれ以外で場合分けを行い、翌日が何年何月何日か求める。

解説

まず入力 \(M\),\(D\) と \(y\), \(m\), \(d\)をint型として受け取ります。

# 入力
M,D=map(int,input().split())
y,m,d=map(int,input().split())

年末の場合、すなわちd=Dかつm=Mの場合は翌年の1月1日なのでy+1 1 1を出力します。
月末の場合、すなわちd=Dの場合は翌月の1日なのでy m+1 1を出力します。
それ以外の場合はy m d+1を出力します。

# 年末の場合
if d==D and m==M:
  print(y+1,1,1)
# 月末の場合
elif d==D:
  print(y,m+1,1)
# それ以外
else:
  print(y,m,d+1)

解答

# 入力
M,D=map(int,input().split())
y,m,d=map(int,input().split())

# 年末の場合
if d==D and m==M:
  print(y+1,1,1)
# 月末の場合
elif d==D:
  print(y,m+1,1)
# それ以外
else:
  print(y,m,d+1)

ABC331 B – Buy One Carton of Milk

問題

問題文の要約は以下の通りです。

問題の要約

6個で \(S\) 円、8個で \(M\) 円、12個で \(L\) 円で商品が売られているとき、\(N\) 個以上商品を買うために必要な最小の金額を求めよ。

制約

・\(1 \le N \le 100\)
・\(1 \le S, M, L \le 10^4\)
・入力は全て整数

入力

\(N\) \(S\) \(M\) \(L\)

出力

答えを出力せよ。

解説

\(N\) は100個と小さいので6個入り、8個入り、12個入りを幾つずつ買うか全探索する。

解説

6 個入りは最大でN//6+1つ、8 個入りは最大でN//8+1つ、12 個入りは最大でN//12+1つ購入する可能性があるので、これをfor文で全探索します。

解答

# 入力
N,S,M,L=map(int,input().split())

# 答え(初期値は大きい数にしておく)
ans=10**10

# 6 個入りを何個買うか
for i in range(N//6+2):
  # 8 個入りを何個買うか
  for j in range(N//8+2):
    # 12 個入りを何個買うか
    for k in range(N//12+2):
      # 合わせて N 個以上か
      if 6*i+8*j+12*k>=N:
        # 最小金額であれば更新
        ans=min(ans,S*i+M*j+L*k)

# 出力
print(ans)
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次