備忘録

徒然なるままに。

競プロ典型:Select +/- One

import numpy as np

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

diff = np.sum(np.abs(A - B))

if diff > K :
    print("No")
else:
    if diff % 2 == K % 2:
        print("Yes")
    else:
        print("No")

実行時間:184ms

構造はシンプルでAとB、2つのリストの要素同士の差の絶対値の合計を求める。それが与えられたKよりも大きければ題意を満たさない。次に、Kの方が大きいときは求めた合計とKの偶奇が一致していれば題意を満たす。従ってこの時のみYesを出力する。
ただコードが冗長な感じは否めない。

def manual_abs(a,b):
  return abs(a - b)
 
N,K = map(int,input().split())
A = list(map(int,input().split()))
B = list(map(int,input().split()))
sumAbs = sum(list(map(manual_abs, A,B)))
result = sumAbs <= K and (K - sumAbs) % 2 == 0 
print('Yes' if result else 'No')

引用:
Submission #41264770 - 競プロ典型 90 問

やっていることは同じだが非常にすっきりしている。ポイントとしてはわざわざnumpyモジュールを持ってきていないところと条件分岐をresultでまとめているところか。map関数への理解の低さも実感した。

N, K = map(int, input().split())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
dif = 0
for a, b in zip(A, B):
    dif += abs(a - b)
if K >= dif and K % 2 == dif % 2:
    print("Yes")
else:
    print("No")

引用:
Submission #41323279 - 競プロ典型 90 問
こちらはもう少し私の書いたコードに近いか。それでも実行時間は27ms程度で十分早い。

前回に引き続き、算数レベルで工夫できるところがまだまだ多いと痛感した。確かに偶奇判定ももっと簡略化できる。