#include <bits/stdc++.h>
using namespace std;
using lli = long long int;
using ulli = unsigned long long int;
struct edge {
  int u, v, cost;
};
struct DirectedGraph {
  int vertex_num;
  int edge_num;
  vector<edge> edge_list;
  vector<vector<int> > adj_list;
};
void displayVector(vector<lli> v) {
  lli n = v.size();
  for (int i = 0; i < n; i++) {
    cout << v[i] << " ";
  }
  cout << endl;
}
vector<lli> argsort(vector<lli> v) {
  lli n = v.size();
  vector<lli> indices(n);
  for (int i = 0; i < n; i++) {
    indices[i] = i;
  }
  sort(indices.begin(), indices.end(),
       [&v](lli i1, lli i2) { return v[i1] > v[i2]; });
  return indices;
}
int main() {
  int N;
  cin >> N;
  lli H;
  cin >> H;
  vector<lli> a(N), b(N);
  for (int i = 0; i < N; i++) {
    cin >> a[i] >> b[i];
  }
  sort(a.begin(), a.end());
  sort(b.begin(), b.end());
  lli a_max = a[N - 1];
  int b_iter = distance(b.begin(), lower_bound(b.begin(), b.end(), a_max));
  lli now_dmg = 0;
  lli out = 0;
  while (now_dmg < H) {
    if (b_iter < N) {
      now_dmg += b[b_iter];
      out++;
      b_iter++;
    } else {
      out += ((H - now_dmg) / a_max);
      if ((H - now_dmg) % a_max != 0) {
        out += 1;
      }
      break;
    }
  }
  cout << out << endl;
  return 0;
}
