#include <bits/stdc++.h>
using namespace std;
using ull = uint64_t;
using ll = int_fast64_t;
using prll = pair<ll, ll>;
constexpr ll MOD = 1000000007;
constexpr ll mINF = -(1LL << 60);
constexpr ll pINF = 1LL << 60;
constexpr ull uINF = 1844674407399900000;
constexpr long double pi = 3.1415926535897932384;
constexpr ll juu = 100000;
constexpr ll hyaku = 1000000;
constexpr int dx[4] = {0, 0, 1, -1};
constexpr int dy[4] = {1, -1, 0, 0};
constexpr int ddx[8] = {0, 0, 1, -1, 1, 1, -1, -1};
constexpr int ddy[8] = {1, -1, 0, 0, -1, 1, 1, -1};
vector<int> factor;
int elast(int maximum) {
  ll cnt = 1;
  int size_of_vector = maximum / 3 + 100;
  factor.reserve(size_of_vector);
  bool flag = false;
  factor.emplace_back(2);
  for (ll i = 3; i <= maximum; i += 2) {
    flag = false;
    for (auto &fac : factor) {
      if (i % fac == 0) {
        flag = true;
        break;
      }
    }
    if (flag) continue;
    ++cnt;
    factor.emplace_back(i);
  }
  return cnt;
}
ll powpow(ll n, ll p) {
  if (p == 0) {
    return 1;
  }
  if (p == 1) return n % MOD;
  if (p % 2 == 1) {
    return (n * powpow(n, p - 1)) % MOD;
  }
  ll dob = powpow(n, p / 2);
  return (dob * dob) % MOD;
}
ll nCrMod(ll n, ll r) {
  ll child = 1;
  ll parent = 1;
  if (r == 0) return 1;
  for (ll i = 0; i < r; ++i) {
    child = child * (n - i) % MOD;
    parent = parent * (r - i) % MOD;
  }
  ll ans = child * powpow(parent, MOD - 2);
  return ans % MOD;
}
ll to_digit(ll num) { return (ll)(to_string(num).size()); }
ll nCr(ll n, ll r) {
  ll val = 1, val2 = 1;
  if (r == 0) return 1;
  if (n < r) return 0;
  for (ll i = 0; i < r; ++i) {
    val *= (n - i);
    val2 *= (r - i);
  }
  return val / val2;
}
ll nPr(ll n, ll r) {
  ll val = 1;
  for (ll i = 0; i < r; ++i) {
    val *= (n - i);
  }
  return val;
}
template <typename T>
bool chmin(T &a, const T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T>
bool chmax(T &a, const T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T>
void eraseSame(T &a) {
  sort(a.begin(), a.end());
  a.erase(unique(a.begin(), a.end()), a.end());
}
template <typename T>
bool swapmax(T &a, T &b) {
  T temp;
  temp = a;
  if (a > b) {
    swap(a, b);
    return false;
  }
  return true;
}
ll GCD(ll x, ll y) { return (x % y) ? GCD(y, x % y) : y; }
ll LCD(ll x, ll y) { return x / GCD(x, y) * y; }
template <typename T>
void splitIn(ll N, vector<T> &array) {
  T temp;
  int i = 0;
  if (N == 0) {
    return;
  }
  array.resize(N);
  while (cin >> temp) {
    array[i] = temp;
    ++i;
    if (i >= N) {
      break;
    }
  }
  return;
}
ll facmod(ll num) {
  ll ans = 1;
  if (num == 0) return 1;
  for (ll i = num; i >= 1; --i) {
    ans = (ans * i) % MOD;
  }
  return ans;
}
ll inv_num(ll num) { return powpow(num, MOD - 2); }
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  ll n, k, m, l;
  ll ans = 0;
  ll sum = 0;
  string s;
  cin >> n >> k;
  vector<pair<ll, ll>> a(n), b(n);
  for (ll i = 0; i < (ll)(n); ++i) {
    cin >> m >> l;
    a[i] = {m, l};
    b[i] = {m, l};
  }
  sort(a.begin(), a.end(),
       [](const pair<ll, ll> &lhs, const pair<ll, ll> &rhs) -> bool {
         return lhs.first < rhs.first;
       });
  sort(b.begin(), b.end(),
       [](const pair<ll, ll> &lhs, const pair<ll, ll> &rhs) -> bool {
         return lhs.second < rhs.second;
       });
  ll div = (*(a.end() - 1)).first;
  reverse(b.begin(), b.end());
  for (auto &o : b) {
    if (div < o.second) {
      sum += o.second;
      ++ans;
    } else {
      break;
    }
  }
  k -= sum;
  ans += ceil((double)k / (double)div);
  cout << ans << "\n";
  return 0;
}
