#define _USE_MATH_DEFINES
#include <bits/stdc++.h>

using namespace std;

typedef long long int ll;
typedef pair<ll, ll> P;
#define INF 10000000000000
#define rep(i, n) for(ll i = 0; i < (ll)(n); i++)
#define rep1(i, n) for(ll i = 1; i < (ll)(n); i++)
#define repN_1(i, n) for(ll i = 0; i < (ll)(n - 1); i++)
#define repM(i, n) for(ll i = (ll)(n - 1); i >= 0; i--)
template<class T>bool chmax(T& a, const T& b) { if (a < b) { a = b; return 1; } return 0; }
template<class T>bool chmin(T& a, const T& b) { if (b < a) { a = b; return 1; } return 0; }

int main()
{
	cout << fixed << setprecision(18);
	ll n, h;
	cin >> n >> h;

	vector<P> thrower, cutter;
	ll a, b;

	rep(i, n) {
		cin >> a >> b;
		cutter.push_back(P(a, b));
		thrower.push_back(P(b, a));
	}

	sort(cutter.begin(), cutter.end(), greater<>());
	sort(thrower.begin(), thrower.end());

	if (n > 1) {
		auto cut = find(thrower.begin(), thrower.end(), P(cutter[0].second, cutter[0].first));
		thrower.erase(cut);
	}

	ll ans = 0;
	while (h > 0) {
		ans++;
		if (thrower.back().first > cutter[0].first && thrower.size() > 1) {
			h -= thrower.back().first;
			thrower.pop_back();
		}
		else if (h <= cutter[0].second)
			h -= cutter[0].second;
		else {
			h -= cutter[0].second;
			ll t = (ll)ceil(h / cutter[0].first);
			ans += t;
			break;
		}
	}


	cout << ans << endl;

	return 0;
}