考えて競プロする

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

ABC033-B - 町の合併 を解く

ABC033-B - 町の合併

 

文字列 s と 数字 p の組み合わせが N 個与えられる

その中で数字 p の合計の過半数以上のものが存在するならば

その組み合わせの s を出力、存在しないならば 'atcoder' と出力する問題

 

もし、過半数以上の数字 p が存在するならば

それは最大値になるはずである

 

なぜなら、過半数以上の数字が2つ以上あったならば、合計を超えてしまうため

2つ以上存在することはありえない

 

ということで、文字列 s と 数字 p を順番にリストに追加していく際に

最大値を求めておき、最後にその最大値が過半数以上であれば

対応する文字列を出力、そうでなければ 'atcoder' を出力する、という方針でいく

 

提出したコード

# 入力
N=int(input())

sl=[]
pl=[]

# 町1つ目
s,p=map(str,input().split())
p=int(p)
sl.append(s)
pl.append(p)

# 最高値を保存する変数(初期値は一つ目を代入)
mx=p

for i in range(N-1):
  s,p=map(str,input().split())
  p=int(p)
  sl.append(s)
  pl.append(p)

  # 最高値を更新
  mx=max(mx,p)

# 最高値が過半数を超えていたらそれに対応する名称を出力
if mx>sum(pl)/2:
  print(sl[pl.index(mx)])
# そうでない場合は'atcoder'を出力
else:
  print('atcoder')

 

入力が "文字列" "数字" の形式であるため、一度どちらも str 型で受け取り

数字の方は int でキャストしている

 

文字列はリストsl に追加、数字はリスト pl に追加しており、

それぞれ順番も一致しているので、sl [ pl.index( mx ) ] と書くことで

最大値 mx に対応した 文字列 s を取り出すことができる

 

ここで、 index( ) というのは リストがもつメソッドであり、

引数にとった値(ここでは mx のこと)がある場所の添字を返してくれる

 

提出結果はACでした