こんにちは, Shinoryoです.
今回はfreee プログラミングコンテスト2023(AtCoder Beginner Contest 310)を, Pythonで解いてみた結果を書き連ねていこうと思います.
freee Programming Contest 2023(AtCoder Beginner Contest 310) - AtCoder
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
目次[非表示]
A - Order Something Else
AtCoderドリンクの値段は, 次の2パターンです.
- 割引券を使わなかった場合:
円 - 割引券を使った場合:
円
したがって, それらのうち安い方を出力すればよいです.
N, P, Q = map(int, input().split()) | |
D = list(map(int, input().split())) | |
print(min(P, Q + min(D))) |
B - Strictly Superior
全てのset()
を使うと高速ですが, list()
を使っても十分ACできると思います.
import itertools | |
# 入力 | |
N, M = map(int, input().split()) | |
P = [] | |
F = [] | |
for i in range(N): | |
input_row = list(map(int, input().split())) | |
P.append(input_row[0]) | |
F.append(set(input_row[2:])) | |
# 条件チェック | |
for i, j in itertools.permutations(range(N), 2): | |
if P[i] < P[j]: | |
continue | |
if F[i] - F[j]: | |
continue | |
if P[i] <= P[j] and not F[j] - F[i]: | |
continue | |
print("Yes") | |
exit() | |
print("No") |
C - Reversible
棒を順番に見ていき, 今までに見たどの棒とも同じでない棒を見るたびにカウンタの値を
「今までに見たどの棒とも同じでない棒」であるかを判断するには, 今までに見た棒を記録しておけば良いです. list()
で格納してしまうと全体の計算量がset()
で格納すれば全体の計算量が
# 入力 | |
N = int(input()) | |
# 入力された文字列を記録していくset | |
string_set = set() | |
for _ in range(N): | |
string_input = input() | |
# 辞書順で若い方をsetに登録する | |
string_set.add(min(string_input, string_input[::-1])) | |
# 出力 | |
print(len(string_set)) |
D - Peaceful Teams
順番に選手をチームに加えていく, またはその選手だけで新たなチームを作るということを順に行っていくことで, 全探索すればよいです. うまくset()
を使うことで高速化できます.
# teamsで表されるチームリストに、新たにnow_memberを追加する | |
# max_member_num: メンバーの最大値 | |
# max_team_num: チーム数の条件 | |
# hate_list: あるメンバーと仲が悪いメンバーのset | |
# ans: 条件を満たすチーム分けが存在すれば、ansに+1していく | |
def add_member(now_member, teams, max_member_num, max_team_num, hate_list, ans): | |
# メンバーの数が最大値を超えたら、チーム数が条件を満たすかを確認する | |
if now_member > N: | |
ans += len(teams) == max_team_num | |
return ans | |
# すでにあるチームにnow_memberを加える場合 | |
for team in teams: | |
# そのチームにnow_memberと仲が悪いメンバーが存在しなければ加える | |
if not hate_list[now_member] & team: | |
team.add(now_member) | |
ans = add_member(now_member + 1, teams, max_member_num, max_team_num, hate_list, ans) | |
team.remove(now_member) | |
# 新たにチームを作れる場合 | |
if len(teams) < max_team_num: | |
teams.append(set([now_member])) | |
ans = add_member(now_member + 1, teams, max_member_num, max_team_num, hate_list, ans) | |
teams.pop() | |
return ans | |
# 入力 | |
N, T, M = map(int, input().split()) | |
# あるメンバーと仲が悪いメンバーのset | |
hate_list = [set() for _ in range(N + 1)] | |
for _ in range(M): | |
A_i, B_i = map(int, input().split()) | |
hate_list[A_i].add(B_i) | |
hate_list[B_i].add(A_i) | |
# 出力 | |
print(add_member(1, [], N, T, hate_list, 0)) |
E以降
E以降は私の能力不足故に省略いたします.
参考にしたサイト等
- 「解説 - freee プログラミングコンテスト2023(AtCoder Beginner Contest 310)」
Editorial - freee Programming Contest 2023(AtCoder Beginner Contest 310)
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
- nkmk様による「Python, set型で集合演算(和集合, 積集合や部分集合の判定など)」
Python, set型で集合演算(和集合, 積集合や部分集合の判定など) | note.nkmk.me
Pythonでは, 集合を表すset型が組み込みのデータ型として提供されている. 集合setは重複しない要素(同じ 値ではない要素, ユニークな要素)のコレクションで, 和集合・差集合・積集合などの集合演算を行うことができる. 組み込み型 - set(集 合)型 — Python 3.11.4 ドキュメント setオブジェクトを生成: {}, 集合内包表記...
0 件のコメント:
コメントを投稿 (Please feel free to ask me about your questions! You can use Japanese or English in the comments.)