aacord’s memo

abcを中心にpythonで解いた問題のメモ、整理をしています。緑になった。

arc 050 B - 花束 (python)

二分探索2つめ。
答えを n と仮定したときに n が条件を満たすかどうかは
(a, b) = (x, 1)*k + (1, y) * (n - k) とおいたときに、R >= a かつ B >= b を満たす 0以上 n以下の整数 k が存在することと同値である。
(厳密にはさらに n <= min(a, b) も必要)
これを正負に注意して展開すると、(r - n)/(x - 1) >= k >= (n * y - b)/(y - 1)となり
k が整数なので求める条件は、 (n * y - b - 1)//(y - 1) + 1 <= (r - n)//(x - 1) となる。
いちいち答えの上限pを考えて WA を量産しまくったので最初から10**18 とかにしておけばよかった。

x,y = [int(i) for i in input().split()]
b,a = map(int,input().split())
p = min(max(x,y)*2//3,min(x,y))

def is_ok(n):
    global x,y,b,a
    return (n*b-x-1)//(b-1)+1 <= (y-n)//(a-1)

def meguru_bisect(ng, ok):
    while (abs(ok - ng) > 1):
        mid = (ok + ng) // 2
        if is_ok(mid):
            ok = mid
        else:
            ng = mid
    return ok

print(meguru_bisect(p+1,-1))