#include <bits/stdc++.h>
int descending_compare(const void *a, const void *b) {
  if (*(int *)a > *(int *)b) {
    return -1;
  } else if (*(int *)a == *(int *)b) {
    return 0;
  } else {
    return 1;
  }
}
int ascending_compare(const void *a, const void *b) {
  if (*(int *)a < *(int *)b) {
    return -1;
  } else if (*(int *)a == *(int *)b) {
    return 0;
  } else {
    return 1;
  }
}
int lower_bound(int *a, int n, int key) {
  int left, mid, right;
  left = 0, right = n;
  mid = (left + right) / 2;
  while ((left + 1 != mid || mid + 1 != right) && mid != left) {
    if (key > a[mid]) {
      left = mid;
    } else {
      right = mid + 1;
    }
    mid = (left + right) / 2;
  }
  if (a[left] >= key) return left;
  if (a[mid] >= key) return mid;
  if (a[right] >= key) return right;
  return n;
}
unsigned long gcd(unsigned long x, unsigned long y) {
  if (y == 0) {
    return x;
  } else {
    return gcd(y, x % y);
  }
}
long long kaijou(int x) {
  long long rtn = 1;
  int i;
  for (i = x; i > 1; i--) {
    rtn = (rtn * i);
  }
  return rtn;
}
int a[100005];
int b[100005];
int main(void) {
  int n, h;
  int i;
  int max = 0;
  int throwing = 0;
  unsigned long long throwing_total = 0;
  int ans;
  scanf("%d %d", &n, &h);
  for (i = 0; i < n; i++) {
    scanf("%d %d", &a[i], &b[i]);
    max = max > a[i] ? max : a[i];
  }
  for (i = 0; i < n; i++) {
    if (max < b[i]) {
      throwing++;
      throwing_total += b[i];
    }
  }
  if (h <= throwing_total) {
    ans = throwing;
  } else if ((h - throwing_total) % max == 0) {
    ans = (h - throwing_total) / max;
    ans += throwing;
  } else {
    ans = (h - throwing_total) / max;
    ans++;
    ans += throwing;
  }
  printf("%d\n", ans);
  return 0;
}
