Buggy python submission (verdict: Time Limit Exceeded):
N,H = map(int,input().split())
AB = [list(map(int,input().split())) for _ in range(N)]
AB_a = sorted(AB, reverse = True, key=lambda x: x[0])
AB_b = sorted(AB, reverse = True, key=lambda x: x[1])
damage = 0
count = 0
j = 0
while damage < H:
  if j < N:
    if AB_b[j][1] >= AB_a[0][0]:
      damage += AB_b[j][1]
      j += 1
    else:
      damage += AB_a[0][0]
  else:
    count += (H-damage)//AB_a[0][0]
    damage = H - (H-damage)%AB_a[0][0]
    if damage == H:
      break
    else:
      count += 1
      break
  count += 1
print(count)

Fixed submission:
from bisect import bisect_left
N,H = map(int,input().split())
A = [0]*N
B = [0]*N

for i in range(N):
  a,b = map(int,input().split())
  A[i] = a
  B[i] = b

A = max(A)
B = sorted(B)

count,damage = 0,0
b = bisect_left(B,A)

for i in range(len(B)-1,b-1,-1):
  damage += B[i]
  count += 1
  if damage >= H:
    print(count)
    exit()

count,damage = 0,0
damage = sum(B[b:])
count += len(B[b:])
count += (H-damage)//A
damage = H - (H-damage)%A
if damage == H:
  pass
else:
  count += 1
print(count)

Buggy python submission (verdict: Time Limit Exceeded):
N,H = map(int,input().split())
AB = [list(map(int,input().split())) for _ in range(N)]
AB_a = sorted(AB, reverse = True, key=lambda x: x[0])
AB_b = sorted(AB, reverse = True, key=lambda x: x[1])
damage = 0
count = 0
j = 0
while damage < H:
  if j < N:
    if AB_b[j][1] >= AB_a[0][0]:
      damage += AB_b[j][1]
      j += 1
    else:
      damage += AB_a[0][0]
  else:
    count += (H-damage)//AB_a[0][0]
    damage = H - (H-damage)%AB_a[0][0]
    if damage == H:
      break
    else:
      count += 1
      break
  count += 1
print(count)

Fixed submission:
from bisect import bisect_left
N,H = map(int,input().split())
A = [0]*N
B = [0]*N

for i in range(N):
  a,b = map(int,input().split())
  A[i] = a
  B[i] = b

A = max(A)
B = sorted(B)

count,damage = 0,0
b = bisect_left(B,A)

for i in range(len(B)-1,b-1,-1):
  damage += B[i]
  count += 1
  if damage >= H:
    print(count)
    exit()

count,damage = 0,0
damage = sum(B[b:])
count += len(B[b:])
count += (H-damage)//A
damage = H - (H-damage)%A
if damage == H:
  pass
else:
  count += 1
print(count)

Buggy python submission (verdict: Time Limit Exceeded):
from collections import deque
N,H = map(int,input().split())
AB = [list(map(int,input().split())) for _ in range(N)]
AB_a = sorted(AB, reverse = True, key=lambda x: x[0])
AB_b = deque(sorted(AB, reverse = True, key=lambda x: x[1]))
damage = 0
count = 0

while damage < H:
  if AB_b != deque([]):
    if AB_b[0][1] >= AB_a[0][0]:
      damage += AB_b[0][1]
      AB_b.popleft()
    else:
      damage += AB_a[0][0]
  else:
    count += (H-damage)//AB_a[0][0]
    damage = H - (H-damage)%AB_a[0][0]
    if damage == H:
      break
    else:
      count += 1
      break
  count += 1
print(count)

Fixed submission:
from bisect import bisect_left
N,H = map(int,input().split())
A = [0]*N
B = [0]*N

for i in range(N):
  a,b = map(int,input().split())
  A[i] = a
  B[i] = b

A = max(A)
B = sorted(B)

count,damage = 0,0
b = bisect_left(B,A)

for i in range(len(B)-1,b-1,-1):
  damage += B[i]
  count += 1
  if damage >= H:
    print(count)
    exit()

count,damage = 0,0
damage = sum(B[b:])
count += len(B[b:])
count += (H-damage)//A
damage = H - (H-damage)%A
if damage == H:
  pass
else:
  count += 1
print(count)

Buggy python submission (verdict: Runtime Error):
from collections import deque
N,H = map(int,input().split())
AB = [list(map(int,input().split())) for _ in range(N)]
AB_a = sorted(AB, reverse = True, key=lambda x: x[0])
AB_b = deque(sorted(AB, reverse = True, key=lambda x: x[1]))
damage = 0
count = 0

while damage < H:
  if AB_b[0][1] > AB_a[0][0]:
    damage += AB_b[0][1]
    AB_b.popleft()
  else:
    damage += AB_a[0][0]
  count += 1
print(count)

Fixed submission:
from bisect import bisect_left
N,H = map(int,input().split())
A = [0]*N
B = [0]*N

for i in range(N):
  a,b = map(int,input().split())
  A[i] = a
  B[i] = b

A = max(A)
B = sorted(B)

count,damage = 0,0
b = bisect_left(B,A)

for i in range(len(B)-1,b-1,-1):
  damage += B[i]
  count += 1
  if damage >= H:
    print(count)
    exit()

count,damage = 0,0
damage = sum(B[b:])
count += len(B[b:])
count += (H-damage)//A
damage = H - (H-damage)%A
if damage == H:
  pass
else:
  count += 1
print(count)