import std.conv;
import std.math;
import std.array;
import std.algorithm;
import std.range;
import std.stdio;
import core.stdc.stdio : scanf;

struct Katana {
  int index;
  int a, b;
}

void main() {
  int n, h;
  scanf("%d %d", &n, &h);
  int[] bs;
  bs.length = n;
  Katana[] ks;
  ks.length = n;
  int max_ai = 0;
  for (int i = 0; i < n; ++i) {
    ks[i].index = i;
    scanf("%d %d", &ks[i].a, &ks[i].b);
    bs[i] = ks[i].b;
    if (ks[i].a > ks[max_ai].a) max_ai = i;
  }

  int max_a = ks[max_ai].a;
  auto sbs = sort!"a > b"(bs); // bs[0 .. max_ai] ~ bs[max_ai + 1 .. $]);
  foreach (i, b; sbs.enumerate) {
    if (b <= max_a) {
      sbs = sbs[0 .. i];
      break;
    }
  }

  int max_at = h / max_a + 1;
  int max_bt = max(0, h - sbs.sum) / max_a + 1 + sbs.length.to!int;
  int max_t = min(max_at, max_bt);
  int min_t = max_t;
  // writeln("max_a ", max_a);
  // writeln("sbs ", sbs);
  // writeln("max_t ", max_t);
  for (int at = 0; at <= max_t; ++at) {
    int damage = at * max_a;
    for (int bt = 1; at + bt <= max_t && bt <= sbs.length; ++bt) {
      damage += sbs[bt-1];
      if (damage >= h) {
        auto t = at + bt ;
        if (min_t > t) {
          min_t = t;
          // writef("best a: %d, b: %d\n", at, bt);
        }
        break;
      }
    }
  }
  writeln(min_t);
}