#include <bits/stdc++.h>
using namespace std;
template <class T>
bool umax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool umin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
template <typename T>
T gcd(T a, T b) {
  if (a == 0) return b;
  return gcd(b % a, a);
}
int findGCD(int arr[], int n) {
  int result = arr[0];
  for (int i = 1; i < n; i++) result = gcd(arr[i], result);
  return result;
}
template <typename T>
T lcm(T m, T n) {
  if ((0 == m) || (0 == n)) return 0;
  return ((m / gcd(m, n)) * n);
}
template <typename A, size_t N, typename T>
void Fill(A (&array)[N], const T &val) {
  fill((T *)array, (T *)(array + N), val);
}
int dx[5] = {1, 0, -1, 0};
int dy[5] = {0, 1, 0, -1};
int main() {
  long long N, H;
  cin >> N >> H;
  vector<long long> a(N), b(N);
  long long sumthrow = 0;
  for (int i = 0; i < (int)(N); i++) {
    cin >> a[i] >> b[i];
  }
  sort(a.begin(), a.end(), greater<long long>());
  sort(b.begin(), b.end());
  auto itr = upper_bound(b.begin(), b.end(), a.front());
  for (auto temp = itr; temp < b.end(); temp++) {
    sumthrow += *temp;
  }
  if (H - sumthrow <= 0) {
    long long sum = 0;
    long long trial = 0;
    reverse(b.begin(), b.end());
    auto itr_b = b.begin();
    while (H > sum && itr_b != b.end()) {
      sum += *itr_b;
      trial++;
    }
    cout << trial << endl;
  } else {
    if ((H - sumthrow) % a[0] == 0) {
      cout << b.end() - itr + (H - sumthrow) / a[0] << endl;
    } else {
      cout << b.end() - itr + (H - sumthrow) / a[0] + 1 << endl;
    }
  }
  return 0;
}
