#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using PII = pair<int, int>;
using PLL = pair<long long, long long>;
const int INF = numeric_limits<int>::max();
const ll INFL = numeric_limits<ll>::max();
constexpr ll TEN(int n) { return (n == 0) ? 1 : 10 * TEN(n - 1); }
long long mod(long long val, long long m) {
  long long res = val % m;
  if (res < 0) res += m;
  return res;
}
long long gcd(ll a, ll b) {
  if (a % b == 0) {
    return b;
  } else {
    return gcd(b, a % b);
  }
}
long long lcm(ll a, ll b) { return a / gcd(a, b) * b; }
ll factorial(ll n) {
  ll res = 1;
  for (ll i = 1; i <= n; i++) {
    res *= i;
  }
  return res;
}
bool fn_is_prime(ll n) {
  for (ll i = 2; i * i <= n; i++) {
    if (n % i == 0) return false;
  }
  return n != 1;
}
bool isOK(int index, int key, vector<ll>& a) {
  if (a[index] >= key)
    return true;
  else
    return false;
}
int binary_search(int key, vector<ll>& a) {
  int ng = -1;
  int ok = a.size();
  while (abs(ok - ng) > 1) {
    int mid = (ok + ng) / 2;
    if (isOK(mid, key, a))
      ok = mid;
    else
      ng = mid;
  }
  return ok;
}
struct UnionFind {
  vector<int> r;
  UnionFind(int N) { r = vector<int>(N, -1); }
  int root(int x) {
    if (r[x] < 0) return x;
    return r[x] = root(r[x]);
  }
  bool unite(int x, int y) {
    x = root(x);
    y = root(y);
    if (x == y) return false;
    if (r[x] > r[y]) swap(x, y);
    r[x] += r[y];
    r[y] = x;
    return true;
  }
  int size(int x) { return -r[root(x)]; }
  bool same(int x, int y) { return root(x) == root(y); }
};
vector<pair<long long, long long> > prime_factorize(long long N) {
  vector<pair<long long, long long> > res;
  for (long long a = 2; a * a <= N; ++a) {
    if (N % a != 0) continue;
    long long ex = 0;
    while (N % a == 0) {
      ++ex;
      N /= a;
    }
    res.push_back({a, ex});
  }
  if (N != 1) res.push_back({N, 1});
  return res;
}
int main() {
  ll n, h;
  cin >> n >> h;
  vector<PLL> k(n);
  ll amax = 0;
  for (int i = 0; i < (n); i++) {
    ll a, b;
    cin >> a >> b;
    k[i] = PLL{b, a};
    amax = max(amax, a);
  }
  sort(k.begin(), k.end());
  reverse((k).begin(), (k).end());
  ll ans = 0;
  int index = 0;
  for (int i = 0; i < (n); i++) {
    h -= k[i].first;
    ans++;
    if (h <= 0) {
      cout << ans << endl;
      return 0;
    }
  }
  ans += ceil((double)(h) / (double)(amax));
  cout << ans << endl;
  return 0;
}
