[ABC441] ABC 441(Atcoder Beginner Contest)のA~C(A,B,C)問題をPythonで解説(復習)
A問題
- 大小関係で内側にあるかどうかを判定すれば良い.
A.py
"""
<方針>
- 大小関係で内側にあるかどうかを判定すれば良い.
"""
# 入力
P, Q = map(int, input().split())
X, Y = map(int, input().split())
# 分岐と出力
if(
(P <= X <= P+100-1) and
(Q <= Y <= Q+100-1)):
print("Yes")
else:
print("No")
B問題
- 文字が全て含まれるかどうかをそれぞれのフラグで管理する.
B.py
"""
<方針>
- 文字が全て含まれるかどうかをそれぞれのフラグで管理する.
"""
N, M = map(int, input().split())
S = input()
T = input()
Q = int(input())
for _ in range(Q):
W = input()
# フラグ
takahashi = True
aoki = True
for w in W:
if(not w in S):
takahashi = False
if(not w in T):
aoki = False
if(takahashi and aoki):
print("Unknown")
elif(takahashi):
print("Takahashi")
elif(aoki):
print("Aoki")
C問題
方針
- 最悪のケースを考える.
- たくさん入ってるやつが全部水だったとして,全部水を選択してしまう状況を考える.
- あとは,量の多い順から飲んでいけば良さそう.
前提
-
C問題あたりで,TLEになる人は,制約条件を見る癖をつけよう. -
AとB問題では,基本的に制約条件を見ずにやっても解ける. - しかし,
C問題以降では,制約条件を見ないと必ずTLEすると思っても良い. - 詳しい話は私の352回の記事 の
C問題の解説に記したので,是非参照してほしい.
C.py
"""
<方針>
- 最悪のケースを考える.
- たくさん入ってるやつが全部水だったとして,全部水を選択してしまう状況を考える.
- あとは,量の多い順から飲んでいけば良さそう.
"""
# 入力
N, K, X = map(int, input().split())
A = list(map(int, input().split()))
A.append(0) # 番兵
A.sort(reverse=True)
sake = 0 # 飲んだ量
for i in range(K+1):
sake += A[N-K+i] # 酒を飲む
if(sake >= X):
break
if(i == K):
# 最後まで飲んでも満たされなかった.
print(-1)
else:
# 水を飲んだ分も足す
print(i+N-K+1)
補足
関係するリンク(参考文献など)
筆者について
- Atcoderアカウント
- 今回も不参加のため,成績なし.
- 解説で示したA問題の提出
- 解説で示したB問題の提出
- 解説で示したC問題の提出
その他
- 間違いを含んでいる可能性があります.
- 方針と言いつつ,方針ではない感想などを書いている可能性があります.
- A問題から解説がだんだん省略されます.
- コードに書かれている解説の文言と,その上に書いてある解説の文言を変えている場合があります.
最後に一言
- コンタクトなし
- 拡張機能なし