考えて競プロする

プログラミングコンテストの問題をどう考えて解いたかを記録していくブログです。使用言語はPython3

ABC008-B - 投票 を解く

ABC008-B - 投票

 

タイトルの通り「投票」して

一番票数の多い人の名前を出力する問題のようだ

 

内容は比較的簡単だけど… どうやって実装するんだ?

 

ん?

 

N(1N50) 

 

最大でも50人しかいないのか…

これだったら多少非効率なやり方でもいけそう

 

上から1人ずつ見ていって、1人目の名前は全体で何回出現するか…

2人目の名前は全体で何回出現するか…

・・・

n人目の名前は全体で何回出現するか…

という風に数えていって、一番出現回数が多かった名前を出力すればいけそうだ

 

50人の名前が出てくるパターンでも

50 × 50 = 2500 回のループ回数で済むので

これなら制限時間内に処理も終わるだろう

 

提出したコード

 
# 入力
n=int(input())
l=[]

for i in range(n):
  l.append(input())

# a:出現最頻の名前 b:最頻出現回数
a=''
b=0

for i in range(len(l)):
  # c:カウントする名前 _b:出現回数
  c=l[i]
  _b=0
  for x in l:
    if x==c:
      _b+=1
  # 出現回数が最頻出現回数を上回っていたら更新
  if b<_b:
    a=c
    b=_b

# 最頻出現回数を出力
print(a) 
  
提出結果はAC
 
今回は O(n^2) のプログラムを書いたけれど
O(n) で解く方法もあるそうだ
 
解説スライドにヒントみたいなものが載っているので
興味がある人は見てみるとよいかもしれない