#if !defined(__clang__) && defined(__GNUC__)
#include <bits/stdc++.h>
#else
#include <cstdlib>
#include <climits>
#include <iostream>
#include <cstdint>
#include <vector>
#include <string>
#include <complex>
#include <bitset>
#include <queue>
#include <deque>
#include <stack>
#include <utility>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <regex>
#endif //  !defined(__clang__) && defined(__GNUG__)
#include <boost/lexical_cast.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/multi_array.hpp>
#include <boost/optional.hpp>
#include <boost/math/common_factor_rt.hpp>

using namespace std;

/**
   ceil(0, 2) == 0
   ceil(1, 2) == 1
   ceil(2, 2) == 1
   ceil(3, 2) == 2
   ceil(4, 2) == 2
*/
template<class T>
T ceil(T dividend, T divisor)
{
    return (dividend + (divisor - 1)) / divisor;
}

int main()
{
    int64_t N, H;
    std::cin >> N >> H;

    struct Sw {
        int64_t d;
        bool once;
    };

    std::vector<Sw> S;
    for (decltype(N) i = 0; i < N; ++i) {
        int64_t a, b;
        std::cin >> a >> b;
        S.push_back({a, false});
        S.push_back({b, true});
    }

    std::sort(std::begin(S), std::end(S),
              [](const auto& a, const auto& b) {
                  return (a.d == b.d) ? !a.once : a.d > b.d;
              });

    int64_t count = 0;
    auto itr = S.begin();
    while (H > 0) {
        if (itr->once) {
            H -= itr->d;
            count++;
            itr++;
        }
        else {
            count += ceil(H, itr->d);
            break;
        }
    }

    std::cout << count << std::endl;

    return 0;
}
