//#define ENABLE_TLE_CODE

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace abc085d {
    class Program {
        internal static int SolveProblem(System.IO.TextReader reader) {
#if ENABLE_TLE_CODE
            var buffer = reader.ReadLine().Split();
            var N = int.Parse(buffer[0]);
            var H = int.Parse(buffer[1]);
            var b = new int[N + 1];
            var a_max = 0;
            var b_lastKatana = 0;
            var lastKatanaNumber = 0;

            for(var i = 1; i <= N; ++i) {
                buffer = reader.ReadLine().Split();
                var a = int.Parse(buffer[0]);
                b[i] = int.Parse(buffer[1]);
                if(a > a_max) {
                    a_max = a;
                    lastKatanaNumber = i;
                    b_lastKatana = b[i];
                }
            }

            var firstPriorityKatana = new List<int>();
            var secondPriorityKatana = new List<int>();
            for(var i = 1; i <= N; ++i) {
                if(i == lastKatanaNumber) continue;
                if(b_lastKatana < b[i]) {
                    firstPriorityKatana.Add(b[i]);
                } else if(a_max < b[i]) {
                    secondPriorityKatana.Add(b[i]);
                }
            }
            firstPriorityKatana.Sort();

            var numberOfAttackTimes = 0;
            for(var i = firstPriorityKatana.Count - 1; i >= 0 && H > 0; --i, ++numberOfAttackTimes) {
                H -= firstPriorityKatana[i];
            }
            if(H <= 0) return numberOfAttackTimes;

            secondPriorityKatana.Sort();
            secondPriorityKatana.Reverse();


            while(H > 0) {
                ++numberOfAttackTimes;
                if(secondPriorityKatana.Count == 0) {
                    H -= H <= b_lastKatana ? b_lastKatana : a_max;
                    continue;
                }

                if(secondPriorityKatana[0] >= b_lastKatana || H > b_lastKatana) {
                    H -= secondPriorityKatana[0];
                    secondPriorityKatana.RemoveAt(0);
                    continue;
                }

                H -= b_lastKatana;


            }
            return numberOfAttackTimes;
#else
            var buffer = reader.ReadLine().Split();
            var N = int.Parse(buffer[0]);
            var H = int.Parse(buffer[1]);
            var b = new List<int>();
            var a_max = 0;

            for(var i = 1; i <= N; ++i) {
                buffer = reader.ReadLine().Split();
                var a = int.Parse(buffer[0]);
                if(a > a_max) {
                    a_max = a;
                }
                b.Add(int.Parse(buffer[1]));
            }
            b = b.Where(v => v > a_max).OrderByDescending(v=>v).ToList();
            var numberOfAttackTimes = 0;
            while(H > 0) {
                if(numberOfAttackTimes < b.Count) {
                    H -= b[numberOfAttackTimes++];
                } else {
                    numberOfAttackTimes+=(int)Math.Ceiling((double)(H) / a_max);
                    break;
                    
                }
            }
            return numberOfAttackTimes;
#endif //ENABLE_TLE_CODE
        }


        static void Main(string[] args) {
            Console.WriteLine(SolveProblem(Console.In));
        }
    }
}


Measured memory_bytes: 21072