# ai<=biなので基本的にbiが強い。最強のaiより弱いbiは使う必要がない

# 順番は関係ないので選びぬかれたbiを強いほうか使っていって、倒せなかったら最強のaiをHがなくなるまで使う

# これだとPypyでギリギリ間に合わん...



n, h = list(map(int, input().split()))

a, b = 0, []

for _ in range(n):

    ai, bi = list(map(int, input().split()))

    a = max(a, ai)

    b.append(bi)

b = list(sorted(b))



l, r = 0, n

while r-l > 0:

    mid = (l + r) // 2

    if b[mid] >= a:

        r = mid

    else:

        l = mid + 1

b = b[r:][::-1]

count = 0

for bi in b:

    h -= bi

    count += 1

    if h <= 0:

        break



if h > 0:

    count += h // a if h % a == 0 else h // a + 1



print(count)

# Bを一回使えると考えると

# - Ai>BiであるBiを使う意味はない(Aiで殴ればいいので)

# - Ai>AjであるAjを使う意味はない（Aiで殴ればいいので）

# つまりA中最強のAiより上（i=j自身を含む）のBjを1度使い、あとはAiで殴る

n, h = list(map(int, input().split()))

power = [list(map(int, input().split())) for _ in range(n)]

maxa = sorted(power, key=lambda x : x[0], reverse=True)[0][0]

muscleb = sorted(list([x for x in power if x[1] >=  maxa]), key = lambda x : x[1], reverse=True)

ans = 0

for m in muscleb:

    ans += 1

    h -= m[1]

    if h <= 0:

        print(ans)

        exit()

additionala = h // maxa

if h % maxa != 0:

    additionala += 1

print((additionala + ans))
# ai<=biなので基本的にbiが強い。最強のaiより弱いbiは使う必要がない
# 順番は関係ないので選びぬかれたbiを強いほうか使っていって、倒せなかったら最強のaiをHがなくなるまで使う
# これだとPypyでギリギリ間に合わん...
n, h = list(map(int, input().split()))
a, b = 0, []
for _ in range(n):
    ai, bi = list(map(int, input().split()))
    a = max(a, ai)
    b.append(bi)
b = list(sorted(b))
l, r = 0, n
while r - l > 0:
    mid = (l + r) // 2
    if b[mid] >= a:
        r = mid
    else:
        l = mid + 1
b = b[r:][::-1]
count = 0
for bi in b:
    h -= bi
    count += 1
    if h <= 0:
        break
if h > 0:
    count += h // a if h % a == 0 else h // a + 1
print(count)

# Bを一回使えると考えると
# - Ai>BiであるBiを使う意味はない(Aiで殴ればいいので)
# - Ai>AjであるAjを使う意味はない（Aiで殴ればいいので）
# つまりA中最強のAiより上（i=j自身を含む）のBjを1度使い、あとはAiで殴る
n, h = list(map(int, input().split()))
power = [list(map(int, input().split())) for _ in range(n)]
maxa = sorted(power, key=lambda x: x[0], reverse=True)[0][0]
muscleb = sorted(
    list([x for x in power if x[1] >= maxa]), key=lambda x: x[1], reverse=True
)
ans = 0
for m in muscleb:
    ans += 1
    h -= m[1]
    if h <= 0:
        print(ans)
        exit()
additionala = h // maxa
if h % maxa != 0:
    additionala += 1
print((additionala + ans))

-# ai<=biなので基本的にbiが強い。最強のaiより弱いbiは使う必要がない -# 順番は関係ないので選びぬかれたbiを強いほうか使っていって、倒せなかったら最強のaiをHがなくなるまで使う -# これだとPypyでギリギリ間に合わん... +# Bを一回使えると考えると +# - Ai>BiであるBiを使う意味はない(Aiで殴ればいいので) +# - Ai>AjであるAjを使う意味はない（Aiで殴ればいいので） +# つまりA中最強のAiより上（i=j自身を含む）のBjを1度使い、あとはAiで殴る -a, b = 0, [] -for _ in range(n): -    ai, bi = list(map(int, input().split())) -    a = max(a, ai) -    b.append(bi) -b = list(sorted(b)) -l, r = 0, n -while r - l > 0: -    mid = (l + r) // 2 -    if b[mid] >= a: -        r = mid -    else: -        l = mid + 1 -b = b[r:][::-1] -count = 0 -for bi in b: -    h -= bi -    count += 1 +power = [list(map(int, input().split())) for _ in range(n)] +maxa = sorted(power, key=lambda x: x[0], reverse=True)[0][0] +muscleb = sorted( +    list([x for x in power if x[1] >= maxa]), key=lambda x: x[1], reverse=True +) +ans = 0 +for m in muscleb: +    ans += 1 +    h -= m[1] -        break -if h > 0: -    count += h // a if h % a == 0 else h // a + 1 -print(count) +        print(ans) +        exit() +additionala = h // maxa +if h % maxa != 0: +    additionala += 1 +print((additionala + ans))