ABC222の参加記録です。
コンテスト主催はエクサウィザーズさんです。ありがとうございます。
使用言語はPython3、レートは600前後の私が自分の理解した内容で記載していきます。
A問題からC問題までのACコード付きです。
A – Four Digits
標準入出力と zfill()
を利用できるかが問われる問題。
Python3では、str型の関数に、zfill()
があります。先頭を0で埋めて、引数に渡した桁数が返ってきます。
この関数を利用して出力したらOKですね。
# エクサウィザーズプログラミングコンテスト2021(AtCoder Beginner Contest 222)
# A - Four Digits
N=str(input())
ans=N.zfill(4)
print(ans)
B – Failing Grade
繰り返し処理と条件分岐が出来るかが問われる問題。
繰り返し処理をしていく中で、条件に当てはまる場合は答え用の変数を1ずつ増やしていけば良いですね。
# エクサウィザーズプログラミングコンテスト2021(AtCoder Beginner Contest 222)
# B - Failing Grade
N,P=map(int,input().split())
A=list(map(int,input().split()))
ans=0
for a in A:
if a<P:
ans+=1
print(ans)
C – Swiss-System Tournament
書いてあることが実装出来ますか。と問われている問題。
データの取り扱いとしては、二次元配列のソートの際に、キーとしたいものの昇順/降順が混在している場合の取り扱いをどうするか。が問われていますね。
以下、この問題を解くための方針を書きます。
- プレイヤー1とプレイヤー2がじゃんけんをして、勝ったプレイヤーを返す関数を作成する。
- 勝ち数を負の値で持つ。
- ラウンド毎にシミュレーションして、ラウンドが終わったら都度勝ち数が多い順に並べる。
- M回実施したら、勝ち数が多い順番に番号を出力する。
勝ち数を負の値で持つ。に関しては、ソートのキーになるのは2種類(勝ち数と番号)あり、勝ち数は大きいほうから順に並べたい一方、同じ勝ち数の場合は、番号が小さいほうから並べたい。これらが混在している状況ではソートがうまく機能しないため、勝ち数を負の数として保持しておきます。
ヒープキューで最大値を取り出したい場合に、正負を反対にして持っておく。というのを読んだことがあったため、比較的すぐに思いつくことができました。
あとは、コードを書いていけばOKですが、C問題にしてはコードを書く量が多いように思いました。
# エクサウィザーズプログラミングコンテスト2021(AtCoder Beginner Contest 222)
# C - Swiss-System Tournament
def janken(p1,p2):
if p1 == p2 : return [0,0]
if p1 == "G" :
return [1,0] if p2=="C" else [0,1]
if p1 == "C" :
return [1,0] if p2=="P" else [0,1]
if p1 == "P" :
return [1,0] if p2=="G" else [0,1]
N,M=map(int,input().split())
ls=[]
for i in range (2*N):
A=list(input())
ls.append([0,i+1,A])
# pop()でlistの後ろから取り出していくため、reverse=True
ls.sort(reverse=True)
for i in range (M):
# ラウンド毎に使用するlistを用意
temp_ls=[]
while ls:
# listからプレイヤー1の情報を取り出す。
# 勝ち数(負数で保持), プレイヤー番号(i-index), じゃんけんの出す手
p1_point, p1_player, p1_GCPs=ls.pop()
p1_GCP = p1_GCPs[i]
# listからプレイヤー2の情報を取り出す。
p2_point, p2_player, p2_GCPs=ls.pop()
p2_GCP = p2_GCPs[i]
# じゃんけんの勝敗を決める。勝者が 1 を獲得する。
res = janken(p1_GCP, p2_GCP)
# 勝ったほうに勝ち数を加算(負の値で持っているため計算上は減算)する
p1_point -= res[0]
p2_point -= res[1]
# 現在のラウンドのlistに結果を格納する。
temp_ls.append([p1_point, p1_player, p1_GCPs])
temp_ls.append([p2_point, p2_player, p2_GCPs])
# ラウンド毎にソートする。pop()で後ろから取り出すため、reverse=True
temp_ls.sort(reverse=True)
# listを更新する。
ls = temp_ls
# 上位のプレイヤーの情報をpop()で取り出しつつ、プレイヤー番号を出力する。
for i in range(2*N):
point, num, GCPs = ls.pop()
# プレイヤー番号は1-indexのため、そのまま出力する。
print(num)
コメント