#include <bits/stdc++.h>
using namespace std;
inline int toInt(string s) {
  int v;
  istringstream sin(s);
  sin >> v;
  return v;
}
template <class T>
inline string toString(T x) {
  ostringstream sout;
  sout << x;
  return sout.str();
}
template <class T>
inline T sqr(T x) {
  return x * x;
}
const double EPS = 1e-10;
const double PI = acos(-1.0);
struct att {
  long long damege;
  long long throwindex;
  bool isthrow = false;
};
int main() {
  long long sumthrowdamage = 0;
  long long N, H;
  cin >> N >> H;
  vector<long long> atack(N), thatack(N);
  vector<att> at;
  long long maxattack = 0;
  int maxindex;
  for (int i = (0); i < (N); ++i) {
    long long a, b;
    cin >> a >> b;
    atack[i] = a;
    if (a > maxattack) {
      maxattack = a;
      maxindex = i;
    }
    att aa;
    aa.damege = a;
    aa.throwindex = i;
    att bb;
    bb.damege = b;
    bb.throwindex = i;
    bb.isthrow = true;
    at.push_back(aa);
    at.push_back(bb);
    thatack[i] = b;
    sumthrowdamage += b;
  }
  if (sumthrowdamage >= H) {
    cout << N << endl;
    return 0;
  }
  sort((at).begin(), (at).end(),
       [&](att& a, att& b) { return a.damege > b.damege; });
  int thrownum = 0;
  int atknum = 0;
  vector<bool> throwd(N);
  set<int> st;
  for (int i = 0; i < at.size(); i++) {
    if (at[i].isthrow) {
      H -= at[i].damege;
      atknum++;
      if (H <= 0) {
        cout << atknum << endl;
        return 0;
      }
    } else {
      atknum += H / at[i].damege + ((H % at[i].damege) != 0);
      cout << atknum << endl;
      return 0;
    }
  }
  cout << atknum << endl;
}
