#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
const int MOD = 1e9 + 7;
const long long LINF = 1e18;
using Graph = vector<vector<int>>;
using Edge = map<pair<int, int>, int>;
template <typename A, size_t N, typename T>
void Fill(A (&array)[N], const T &val) {
  std::fill((T *)array, (T *)(array + N), val);
}
long long gcd(long long a, long long b) {
  if (a % b == 0)
    return (b);
  else
    return (gcd(b, a % b));
}
long long lcm(long long a, long long b) { return a * b / gcd(a, b); }
bool compare_by_b(pair<long long, long long> a, pair<long long, long long> b) {
  if (a.second != b.second) {
    return a.second > b.second;
  } else {
    return a.first > b.first;
  }
}
int main() {
  cout << fixed << setprecision(15);
  long long N, H;
  cin >> N >> H;
  vector<pair<long long, long long>> A(N);
  long long amax = 0;
  long long aid = 0;
  for (long long i = 0; i < (long long)(N); ++i) {
    cin >> A[i].first >> A[i].second;
    if (A[i].first > amax) {
      amax = A[i].first;
      aid = i;
    }
  }
  sort(A.begin(), A.end(), compare_by_b);
  long long ans = 0;
  for (long long i = 0; i < (long long)(N); ++i) {
    if (A[i].second <= amax) break;
    if (H <= amax) {
      H = 0;
      ans++;
      cout << ans << endl;
      return 0;
    }
    H -= A[i].second;
    ans++;
  }
  if (H > 0) {
    ans += (H - 1) / A[aid].first + 1;
  }
  cout << ans << endl;
  return 0;
}
