ABC222参戦記

プログラミング

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)

コメント

タイトルとURLをコピーしました