import java.io.{BufferedReader, InputStream, InputStreamReader}
import java.util.StringTokenizer

import scala.collection.mutable
import scala.util.Sorting
import math.{abs, max, min}
import scala.collection.mutable.{ArrayBuffer, ListBuffer}

object Main {
  val MOD = 1000000007
  def solve(): Unit = {
    val sc = new InputReader(System.in)
    val N = sc.nextInt()
    val H = sc.nextInt()
    val A = Array.ofDim[Int](N)
    val B = Array.ofDim[Int](N)
    (0 until N) foreach { i =>
      A(i) = sc.nextInt()
      B(i) = sc.nextInt()
    }

    Sorting.quickSort(B)
    val Amax = A.max
    val ub = upperBound(B, Amax)
    val (dmg, killedAt) = (ub until N).foldRight((0, -1)) { case (i, (sum, j)) =>
      if (j == -1) {
        (sum + B(i), if (sum + B(i) >= H) i else -1)
      } else {
        (sum, j)
      }
    }

    val ans = if (killedAt != -1) {
      N - killedAt
    } else {
      val remainHealth = H - dmg
      N - ub + (remainHealth - 1) / Amax + 1
    }

    println(ans)
  }


  def main(args: Array[String]): Unit = {
    solve()
  }


  class InputReader(val stream: InputStream) {
    private val reader = new BufferedReader(new InputStreamReader(stream), 32768)
    private var tokenizer: StringTokenizer = null

    def next: String = {
      while (tokenizer == null || !tokenizer.hasMoreTokens)
        tokenizer = new StringTokenizer(reader.readLine)
      tokenizer.nextToken
    }

    def nextInt(): Int = next.toInt
    def nextLong(): Long = next.toLong
    def nextChar(): Char = next.charAt(0)
  }

  def upperBound(a: Array[Int], x: Int): Int = {
    def step(l: Int, h: Int): Int = {
      if (h - l == 1) h
      else {
        val mid = l + (h - l) / 2
        if (a(mid) > x) step(l, mid)
        else step(mid, h)
      }
    }
    step(-1, a.length)
  }
}
