atcoder ABC312 C - Invisible Handの勉強
・参考:
ABC312 C問題(Invisible Hand)を解く - プロひろ
・説明:二分探索で解く。okとngを二分探索で更新していきokが最終結果になる。(
二分探索アルゴリズムを一般化 〜 めぐる式二分探索法のススメ 〜 - Qiita
を参照)
import bisect n,m=map(int, input().split()) a=list(map(int, input().split())) b=list(map(int, input().split())) a.sort() b.sort() ok=10**9+1 ng=0 while abs(ok-ng)!=1: mid=(ok+ng)//2 cnt_sell=bisect.bisect_right(a,mid) #aが90,110,120のときmid=110だとcnt_sell=2になる。leftだと1になってしまう。 cnt_buy=m-bisect.bisect_left(b,mid) #bが80,100,120,1000のときmid=120だとcnt_buy=2になる。rightだと1になってしまう。 #例えば、cnt_sell>=cnt_buyのときmidの値が大きいので(売りては高く売りたい)ok=midに更新して次のmidを小さくする。 if cnt_sell>=cnt_buy: ok=mid else: ng=mid print(ok)