パナソニックプログラミングコンテスト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)
コメント