#include <bits/stdc++.h>
using namespace std;
const int INF = INT_MAX;
const long long INFL = LONG_LONG_MAX;
const double PI = atan(1) * 4;
const int MOD = pow(10, 9) + 7;
int dy[] = {0, 0, 1, -1, 0};
int dx[] = {1, -1, 0, 0, 0};
template <typename T>
istream& operator>>(istream& is, vector<T>& vec) {
  for (T& x : vec) is >> x;
  return is;
}
template <typename T>
ostream& operator<<(ostream& os, vector<T>& vec) {
  for (int i = 0; i < vec.size(); i++) {
    os << vec[i] << (i + 1 == vec.size() ? "" : " ");
  }
  return os;
}
template <typename T>
struct edge {
  int src, to;
  T cost;
  edge(int to, T cost) : src(-1), to(to), cost(cost) {}
  edge(int src, int to, T cost) : src(src), to(to), cost(cost) {}
  edge& operator=(const int& x) {
    to = x;
    return *this;
  }
  operator int() const { return to; }
};
bool is_prime(int N) {
  if (N == 1) return false;
  int sqn = sqrt(N);
  for (auto i = 2; i <= sqn; i++) {
    if (N % i == 0) return false;
  }
  return true;
}
int main() {
  int n, h;
  cin >> n >> h;
  vector<pair<int, int> > k(n);
  for (int i = 0; i < n; i++) {
    cin >> k[i].first >> k[i].second;
  }
  sort(k.begin(), k.end(),
       [](pair<int, int> a, pair<int, int> b) { return a.second > b.second; });
  auto mx = *max_element(
      k.begin(), k.end(),
      [](pair<int, int> a, pair<int, int> b) { return a.first < b.first; });
  int p = 0;
  while (k[p].second > mx.first) {
    p++;
  }
  k.erase(next(k.begin(), p), k.end());
  ll attacksum = 0;
  for (auto el : k) {
    attacksum += el.second;
  }
  int count = 0;
  count = (h - attacksum) / mx.first;
  h -= count * mx.first;
  int q = 0;
  while (h > 0) {
    h -= k[q].second;
    count++;
    q++;
  }
  cout << count << endl;
  return 0;
}
