PythonでJOI難易度6を埋める #14

A - 長いだけのネクタイ (Just Long Neckties)

最初はDPと思っていたけど,sortして,順番に計算していけばよい.A,B のどちらも昇順でsortして前から順番に差を求めたときに"奇妙さが"が最小になる.最小値になるネクタイ以外を除いた場合は,もちろん最小値以上になるので,前に値と比較して更新していく.図を持ちいた分かりやすい解説参考にした記事

from sys import stdin
input = stdin.readline

n = int(input().strip())
a = list(map(int, input().strip().split()))
b = list(map(int, input().strip().split()))


sort_a = []
for i in range(n + 1):
    sort_a.append([a[i], i])

a.sort()
sort_a.sort()
b.sort()
p  =[i[1] for i in sort_a] #p[i],sortされたi番目の要素の元々のindex

ans = [-1] * (n + 1)
tmp_ans = 0
for i, j in zip(a, b):
    tmp_ans = max(i - j, tmp_ans)
ans[p[-1]] = str(tmp_ans) #joinできるようにsrtにする

for i in reversed(range(n)):
    tmp_ans = max(a[i + 1] - b[i], tmp_ans) #ネクタイをずらす
    ans[p[i]] = str(tmp_ans) #joinできるようにsrtにする

print(' '.join(ans))

できたこと

  • 最小値になるのは,Aを昇順でsortしたときになること

学んだこと

  • 多次元配列をinで引っぱてくるときに,その要素数と同じ数の変数で受けとれる
  • indexと要素を一緒にもって考える.←けっこう使う