//为郝尚诚写亦！！
//勿hack余，否则君必悔之！！若如此，请寄言，吾望得！！下为正文：
//#define LOCAL_TIME
//#define FILE_JUDGE
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define rep(i,n) for (int i=0;i<(n);i++)
#define Rep(i,a,b) for (int i=(a);i<=(b);i++)
#define rrep(i,n) for (int i=(n)-1;i>=0;i--)
#define rRep(i,a,b) for (int i=(a);i>=b;i--)
#define repit(it,a) for ((__typeof(a.begin())) it=a.begin();it!=a.end();it++)
#define X first
#define Y second
#define sqr(x) ((x) * (x))
#define eprintf(...) fprintf(stderr, __VA_ARGS__),fflush(stderr)
#define all(a) (a).begin(),(a).end()
#define rall(a) (a).rbegin(),(a).rend()
#define reunique(v) v.erase(unique(v.begin(),v.end()),v.end())
#define prl cerr << "called: " << __LINE__ << endl
#define eaq(n,x) __typeof(x) n=x;
#define RET(p,x) return p<<x<<endl,0;
#define Debug(x) cerr<<#x<<" = "<<x<<endl
#define Debug22(x,y) cerr<<#x<<" = "<<x<<" , "<<#y<<" = "<<y<<endl
#define Debug2(x, y) cerr<<"("<<#x<<", "<<#y<<") = ("<<x<<", "<<y<<")\n"
#define Debug3(x,y,z) cerr<<"("<<#x<<", "<<#y<<", "<<#z<<") = ("<<x<<", "<<y<<", "<<z<<")\n"
#define Debug_arr(v,n) for(int i=0;i<n;++i) cerr<<#v<<"["<<i<<"]"<<" = "<<v[i]<<endl
#define FOPEN(x) string filename=#x;const string filein=filename+".in",fileout=filename+".out";\
freopen(filein.c_str(),"r",stdin);freopen(fileout.c_str(),"w",stdout)
unsigned long long rdtsc(){
	unsigned long long ret = 0;
	#ifdef __clang__
    return __builtin_readcyclecounter();
	#endif
	#ifndef _MSC_VER
    asm volatile("rdtsc" : "=A" (ret) : :);
	#endif
	return ret;
}
inline void read(int &x) {__builtin_scanf("%d",&x);}
inline void read(long long &x) {__builtin_scanf("%lld",&x);}
inline void read(double &x) {__builtin_scanf("%f",&x);}
inline void read(char &x) {char c=getchar();while(c<=32)c=getchar();x=c;}
inline void read(char *x) {__builtin_scanf("%s",x);}
inline void read(string &x) {char y[1000000];__builtin_scanf("%s",y);x=y;}
inline void write(const int &x) {__builtin_printf("%d",x);}
inline void write(const long long &x) {__builtin_printf("%lld",x);}
inline void write(const double &x) {__builtin_printf("%.9f",x);}
inline void write(const char &x) {putchar(x);}
inline void write(const char *x) {__builtin_printf("%s",x);}
inline void write(const string &x) {__builtin_printf("%s",x.c_str());}
template <typename T,typename... Args> void read(T& a,Args&... b){read(a);read(b...);}
template <typename T,typename... Args> void write(T a,Args... b){write(a);write(b...);}
#define lowbit(n) ((n)&(-(n)))
#define setbit(n, b) ((n)|((n)>>1<<(b)))
#define removebit(n, b) ((n)&~((n)>>1<<(b)))
#define flipbit(n, b) ((n)^((n)>>1<<(b)))
#define checkbit(n,b) (((n)>>(b))&1)
template <class T> bool uax(T &a,const T &b) {if (a<b) {a=b;return 1;} return 0;}
template <class T> bool uin(T &a,const T &b) {if (b<a) {a=b;return 1;} return 0;}
inline int pt(int a[],int l,int r){int p,i,j;p=a[l];i=l;j=r+1;for(;;){while(a[++i]<p)if(i>=r)break;while(a[--j]>p)
if(j<=l)break;if(i>=j)break;else swap(a[i],a[j]);}if(j==l)return j;swap(a[l],a[j]);return j;}
inline void q_sort(int a[],int l,int r){int q;if(r>l){q=pt(a,l,r);q_sort(a,l,q-1);q_sort(a,q+1,r);}}
template<class T,class E>T Themost(T a[],int l,int r,E x){int m=(l+r)/2;if(l==r-1){return a[l];}else{
int u=Themost(a,l,m,x);int v=Themost(a,m,r,x);return x(u,v);}}
bool isprime(const int &x){if(x<=4||x%2==0||x%3==0){return x==2||x==3;}for(int i=5;i*i<=x;i+=6){if
(x%i==0||x%(i+2)==0){return false;}}return true;}
template<class T>T gcd(T m,T n){while(n!=0){T t=m%n;m=n;n=t;}return m;}
template<class T>T lcm(const T &x,const T &y){return x/gcd(x,y)*y;}
template<class F>inline ll lowerbound(ll x,ll y,F cmp,bool p=false){ll ans=-1;while(x<=y){ll m=x+y>>1;if(cmp(m)){
ans=m;if(!p)x=m+1;else y=m-1;}else{if(!p)y=m-1;else x=m+1;}}return ans;}
const int inf=1e9;
const ll h1=239017;
const ll h2=731604233;
const ll mod=1000000007;
const ll mod2=1000000009;
const int dx[]={1,0,-1,0,1,0,-1,0};
const int dy[]={0,1,0,-1,1,0,-1,0};
const double pi=3.141592653589793;
const bool multitests=false,alotoftests=false;
ll n,k;
vector <pair <ll,ll> > v;
ll sum=0;
bool solve(const int &__test)
{
	read(n,k);
	rep(i,n)
	{
		ll a,b;
		read(a,b);
		v.push_back({a,b});
		sum+=b;
	}
	sort(v.begin(),v.end(),[&](const pair <ll,ll> &a,const pair <ll,ll> &b){return a.second>b.second;});
	if (sum>k)
	{
		ll ans=0;
		for (auto x:v)
		{
			k-=x.second;
			ans++;
			if (k<=0)
			{
				write(ans);
				return 0;
			}
		}
	}
	else
	{
		auto t=v;
		sort(v.begin(),v.end(),[&](const pair <ll,ll> &a,const pair <ll,ll> &b){return a.first>b.first;});
		int ii=t.size();
		rep(i,(int)t.size())
		{
			auto x=t[i];
			if (x.second<v[0].first)
			{
				ii=i;
				break;
			}
			k-=x.second;
		}
		write(k/v[0].first+(k%v[0].first!=0)+ii);
	}
	return false;
}
signed main()
{
	rdtsc();ios_base::sync_with_stdio();cin.tie();cout.tie();
	#ifdef FILE_JUDGE
	FOPEN(inoutput);
	#endif
	int __tests,__test=1;(multitests==true)?((alotoftests==false)?scanf("%d",&__tests):__tests=inf):__tests=1;
	for (;(alotoftests==true && multitests==true)?(!solve(__test)):(__test<=__tests);++__test)
	{if(!(multitests==true && alotoftests==true)){solve(__test);}}
	#ifdef LOCAL_TIME
	eprintf("\n\nSystem Time : %d ms",clock());
	#endif
	return 0;
}
