Problem:

Problem B: U&U

Problem

  $2$つのチーム、チームUKUとチームうしがある。最初、チームUKUには$N$人、チームうしには$M$人の人がいる。
  チームUKUとチームうしは「U&U」というゲームを行うことにした。「U&U」は$2$つのチームで共通のスコアを持っており、互いに協力しあい共通のスコアを最小化することが目的である。「U&U」は最初、すべての人の体力が$2$で、共通のスコアは$0$の状態で以下のような手順で進められる。

  

    
チームUKUの人は1人ずつ、チームうしの誰か$1$人に対してちょうど$1$回の攻撃を行う。
      攻撃を受けた人は体力が$1$減り、体力が$0$になった場合そのチームから抜ける。
      このときチームうしの人数が$0$人になったら、ゲームを終了する。
      チームUKUのすべての人がちょうど$1$回の攻撃を終えた時点でゲームが終了してなければ共通のスコアに$1$が加算され、$2$.に進む
    

    

      同様に、チームうしの人が$1$人ずつ、チームUKUの誰か$1$人に対してちょうど$1$回の攻撃を行う。
      攻撃を受けた人は体力が$1$減り、体力が$0$になった場合そのチームから抜ける。
      このときチームUKUの人数が$0$人になったら、ゲームを終了する。
      チームうしのすべての人がちょうど$1$回の攻撃を終えた時点でゲームが終了してなければ共通のスコアに$1$が加算され、$1$.に戻る
    

  

  

  チームUKUの人数とチームうしの人数が与えられたとき、「U&U」ゲーム終了時の共通のスコアとしてありえるものの最小値をもとめよ。

Input

入力は以下の形式で与えられる。

$N$ $M$

  チームUKUの人数を表す整数$N$とチームうしの人数を表す整数$M$が空白区切りで与えられる。

Constraints

入力は以下の条件を満たす。

    
$1 \le N, M \le 10^{18}$

    
$N$と$M$は整数

Output

最小のスコアを$1$行に出力せよ。

Sample Input 1

20 10

Sample Output 1

0

Sample Input 2

10 20

Sample Output 2

1

Sample Input 3

64783 68943

Sample Output 3

4

Sample Input 4

1000000000000000000 1000000000000000000

Sample Output 4

2



Sample input:
20 10


Sample output:
0

Submission status: Accepted

Solution code:
A, B = map(int, input().split())
score = 0
score_a = A * 2
score_b = B * 2
a = A
b = B

while True :
    score_b -= a
    if score_b <= 0 :
        break
    else :
        score += 1
        if score_b < b :
            b = score_b
    
    score_a -= b
    if score_a <= 0 :
        break
    else :
        score += 1
        if score_a < a :
            a = score_a
            
ans = score

a = A
b = B
score = 0
score_a = a * 2
score_b = b * 2

while True :
    score_b -= a
    if score_b <= 0 :
        break
    else :
        score += 1
        if score_b < b and A < B :
            b = score_b
        elif score_b < b and A > B :
            if score_b % 2 == 0 :
                b = score_b // 2
            else :
                b = score_b // 2 + 1
    
    score_a -= b
    if score_a <= 0 :
        break
    else :
        score += 1
        if score_a < a and A > B :
            a = score_a
        elif score_a < a and A < B:
            if score_a % 2 == 0 :
                a = score_a // 2
            else :
                a = score_a // 2 + 1

if ans < score :
    print(ans)
else :
    print(score)

Submission status: Accepted

Solution code:
def solve(A, B, hoge):
    C, D = 0, 0
    turn = 0
    while True:
        if turn % 2 == 0 and hoge == 0:
            n = A + C
            m = min(n, D)
            D -= m
            n -= m
            m = min(n/2, B)
            B -= m
            n -= m*2
            if B > 0 and n > 0:
                B -= 1
                D += 1
        elif turn % 2 == 1 and hoge == 0:
            n = B + D
            m = min(n, A)
            A -= m
            C += m
            n -= m
            m = min(n, C)
            C -= m
            n -= m
        elif turn % 2 == 0 and hoge == 1:
            n = A + C
            m = min(n, B)
            B -= m
            D += m
            n -= m
            m = min(n, D)
            D -= m
            n -= m
        else:
            n = B + D
            m = min(n, C)
            C -= m
            n -= m
            m = min(n/2, A)
            A -= m
            n -= m*2
            if A > 0 and n > 0:
                A -= 1
                C += 1
        if A + C <= 0 or B + D <= 0:
            return turn
        turn += 1

if __name__ == "__main__":
    A, B = map(int, raw_input().split())
    print min(solve(A, B, 0), solve(A, B, 1))

Submission status: Accepted

Solution code:
N,M = map(int,input().split())

ah = N*2
bh = M*2
ans1 = 0
while True:
    ap = min(N,ah)
    bh -= ap
    if bh <= 0:
        break
    ans1 += 1
    #print('ans1,ah,bh,ap',ans1,ah,bh,ap)
    bp = (bh+1)//2
    ah -= bp
    if ah <= 0:
        break
    ans1 += 1
    #print('ans1,ah,bh,bp',ans1,ah,bh,bp)

#print(ans1)

ah = N*2
bh = M*2
ans2 = 0
while True:
    ap = (ah+1)//2
    bh -= ap
    if bh <= 0:
        break
    ans2 += 1
    bp = min(M,bh)
    ah -= bp
    if ah <= 0:
        break
    ans2 += 1

#print(ans2)

print(min(ans1,ans2))

Submission status: Accepted

Solution code:
def inpl(): return list(map(int, input().split()))
N, M = inpl()

n2 = N * 1
n1 = N * 1
m1 = M * 1
mall = M * 2

# うくをほろぼす
ans1 = 0
while True:
    mall -= n1
    m1 = -(-mall//2)
    
    if mall <= 0:
        break
    ans1 += 1
    
    if n2 - m1 >= 0:
        n2 -= m1
    else:
        n1 = n1 + n2 - m1
        n2 = 0
    if n1 <= 0:

        break
    ans1 += 1

# ushiを滅ぼす

ans2 = 0
n2 = N * 1
n1 = N * 1
m1 = M * 1
m2 = M * 1
mall = M * 2
nall = N * 2

while True:
    if m2 - n1 >= 0:
        m2 -= n1
    else:
        m1 = m1 + m2 - n1
        m2 = 0
    if m1 <= 0:

        break
    ans2 += 1

    nall -= m1
    n1 = -(-nall//2)
    
    if nall <= 0:
        break
    ans2 += 1

print(min(ans1, ans2))