ABC231参戦記

プログラミング

パナソニックプログラミングコンテスト2021(AtCoder Beginner Contest 231) の参加記録です。
Python3で、レートは600台です。
C問題が解けたり解けなかったり、稀にD問題が解けたりする私が、AからCまでを自分が理解した内容で振り返る記事です。
ちなみに、コンテスト主催のPanasonicさんは、大好きなメーカーです。
この記事もLetsNoteで書いています。先ほど、おかずを温めたレンジもPanasonicのビストロです。おかずが入っていたのも、Panasonicさんの冷蔵庫です。

A – Water Pressure

標準入出力と四則演算が出来るかが問われる問題。
今回は、ここ最近のA問題に比べて非常にシンプルで、何か罠があるのではないかと思ってしまいました。

Python3での割り算は、 / を使用すれば良いですね。切り捨ての場合は、 // を使用します。
コンピュータで小数点以下の数字を扱うときは、小数点誤差が出るため注意が必要ですが、この問題では気にすることなく、入力値を受け取って、100で割った数を出力すればOKですね。

# パナソニックプログラミングコンテスト2021(AtCoder Beginner Contest 231)
# A - Water Pressure

D=int(input())

print(D/100)

B – Election

繰り返し処理と、dict() が利用できますか。が問われている問題。
数日前に、アルゴ式というサービスで、似たような問題を解いていたため、非常にすんなりと解けました。(アルゴ式の想定解法とは違う解き方だと思います。)

順番に処理していき、候補者が今までに出てきていたら、値を1増やす。まだ、出てきてない候補者の場合は、値を1にセットする。
最も値が大きい人を出力する。
(最も値が大きい人を出力するために、常に値が更新されるかをチェックするようにしました。ほかにも、dictを値でソートするなどの方法も考えられると思います。)

# パナソニックプログラミングコンテスト2021(AtCoder Beginner Contest 231)
# B - Election

N = int(input())
dic = dict() # 投票されている人と獲得投票数を管理
maxvote = 0 # 現時点で最も獲得投票数が多い人の獲得票

for i in range (N):
    S = input()
    if S in dic:
        dic[S] += 1
        # 現時点の最多獲得票の更新
        maxvote = max(maxvote, dic[S])
    else:
        dic[S] = 1
        # 現時点の最多獲得票の更新
        maxvote = max(maxvote, dic[S])

for k, v in dic.items():
    if v == maxvote:
        print(k)

上で少し書いた、dictを値でソートするなどの方法でもAC出来ました。

N = int(input())
dic = dict()

for i in range (N):
    S = input()
    if S in dic:
        dic[S] += 1
    else:
        dic[S] = 1
ls = list(dic.items())
ls.sort(key=lambda x:x[1])
ans = ls.pop()[0]
print(ans)

(key, value) のセットになった状態の配列を value でソートする場合、少し面倒くさいので、この問題では、最多獲得票数を常に更新していくのが楽だと思います。

また、Python3では、collections モジュールの Counter を利用するともっと記述量が減る方法があります。
最も出現頻度が高い一つを取得するなら以下のコードでも可能ですね。
コンテスト中に書けるか。というと、私は怪しいですね。

from collections import Counter
N = int(input())
C = Counter([input() for i in range (N)])
print(C.most_common()[0][0])

C – Counting 2

二分探索が出来ますか。が問われる問題。

ソートした配列に対して、Python3の bisect モジュールの bisect_left() を利用することで、対象の要素がどのindexに入るかがわかります。
あとは、Nとの差を出力すればOKですね。

# パナソニックプログラミングコンテスト2021(AtCoder Beginner Contest 231)
# C - Counting 2

from bisect import bisect_left

N, Q = map(int,input().split())
A = list(map(int,input().split()))
A.sort()

for i in range(Q):
    x = int(input())
    idx = bisect_left(A, x)
    print(N-idx)

コメント

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