AtCoder Beginner Contest 188 A〜C問題

前書き

本日は死ぬほど頭が回っておらず、C問題でやたら躓いてしまいました。
ほんとダメです。思考の視野を広げないといけません。

A問題

難易度:灰
時間:2分

atcoder.jp

X,Y=map(int,input().split())
if min(X,Y)+3>max(X,Y):print('Yes')
else: print('No')

B問題

難易度:灰
時間:2分

atcoder.jp

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

_sum = 0
for i in range(N):
  _sum+=A[i]*B[i]
if _sum==0: print('Yes')
else: print('No')

C問題

難易度:灰

atcoder.jp

問題自体は2**N人のトーナメント制で準優勝に該当する学生番号を回答する問題。
最初計算量の観点から見ても、1つずつトーナメントで競わせながら、最後に残った2人のうちの準優勝を出力するという解き方で実装していました。

ところが考えを変えてみると、前半・後半の半分に分割した後、
前半・後半それぞれで最もスコアが高い学生を最後に競わせ、敗北した方(=準優勝)の学生番号を取得する方が簡単だと思いました。

np.argmax()が非常に便利な回です。

以下が実装コードです。

import numpy as np
N = int(input())
A = np.array(list(map(int,input().split())))
harf = int(A.size/2)
A_f,A_b=A[:harf],A[harf:]
A_fmax = np.argmax(A_f)
A_bmax = np.argmax(A_b)
res = A_bmax+harf+1 if A[A_fmax]>A[harf+A_bmax] else A_fmax+1
print(res)

結果

今日はほんと出来が悪いです。。。
ここ数日、スランプのように問題が解けなくなってしまいました。