Problem:
問題 E : ファーストアクセプタンス
プログラミングコンテストでは，各問題に関して，
その問題を最初に正解した人の名前や正解時間が，
ファーストアクセプタンス（最初の正解）として解説等でしばしば言及される．
久しぶりにプログラミングコンテストに参加するとはいえ，予選で落ちるとは到底思えない．
ならば，最初のうちは，多少高いスコアを取ることを目指すよりも，
ファーストアクセプタンスを多く獲得し，存在をアピールしたほうが良いのではないか．
自分の実力を持ってすれば，各問題を見た瞬間に，
その問題を自分が何分で解くことができるかと，
その問題が開始後何分で自分以外の参加者によって最初に解かれるかがわかる．
これらの情報を用いて，
どの程度ファーストアクセプタンスを獲得できるかを計算するプログラムを作っておこう．
問題
N
問の問題から成るプログラミングコンテストを考える．
問題
i
を自分が解くには
A
i
秒の時間がかかり，
また，問題
i
は開始後
B
i
秒で自分以外の参加者によって最初に解かれるとする．
自分が問題を解く順番は自由に決められるが，
1 つの問題を解き始めたら，解き終えるまでその問題をやるものとする．
問題を解き終え次の問題に取りかかる際などの，
問題を解いている時間以外の時間は十分小さいと考え，無視して考えることにする．
また，全ての問題は終了までに 1 人以上の自分以外の参加者によって解かれるものと考える．
自分以外の参加者によって最初に解かれるよりも早く，
あるいは同時に問題
i
を自分が解きおえた時，
問題
i
のファーストアクセプタンスを獲得できる．
すなわち，問題
i
を自分が開始後
t
i
秒に解き終えたとしたとき，
t
i
≤
B
i
であれば，問題
i
のファーストアクセプタンスを獲得できる．
最大で何個の問題に関してファーストアクセプタンスが獲得できるかを計算するプログラムを作成せよ．
入力
入力の最初の行は 1 つの整数
N
を含む．
続く
N
行には，各問題に関する情報が与えられる．
これらの行のうちの
i
行目には 2 個の数字
A
i
,
B
i
が書かれている．
出力
最大で獲得することのできるファーストアクセプタンスの数を出力せよ．
制約
1 ≤
N
≤ 1000
1 ≤
A
i
≤ 10
6
(
1 ≤
i
≤
N
)
1 ≤
B
i
≤ 10
6
(
1 ≤
i
≤
N
)
部分点
この問題の判定には，20 点分のテストケースのグループが設定されている．
このグループに含まれるテストケースの入力は以下を満たす．
1 ≤
N
≤ 16
入出力例
入出力例 1
入力例 1:
3
3 5
5 9
10 20
入力例 1 に対する出力例:
3
入出力例 2
入力例 2:
3
3 2
5 15
10 12
入力例 2 に対する出力例:
2

Submitted solutions:

code_snippet: #include <bits/stdc++.h>    
using namespace std;
using ll=long long;
using dll=long double;
using pq=priority_queue<int,vector<int>,greater<int>>;
using graph=vector<vector<int>>;

#define int ll
#define db dll
#define sbt(x) (x).begin(),(x).end()
#define gyaku(x) reverse(sbt(x))
#define vset(x) x.erase(unique(x.begin(),x.end()),x.end())
#define so(x) sort(x.begin(),x.end())

/* I miss the old Kanye */
#define fi first
#define se second
#define vi vector<int>
#define P pair<int,int>
#define pb push_back
#define r() cout<<'\n'

typedef unsigned long long ull;

const ll mod=1000000007;
const ll modint=998244353;
const ll INF=1LL<<60;
const double pi=3.141592653589793;

const int dx[8] = {1, 0, -1, 0, 1, 1, -1, -1};
const int dy[8] = {0, 1, 0, -1, -1, 1, -1, 1};
// const int dx[4] = {1,0,-1,0}; 
// const int dy[4] = {0,1,0,-1};
const string YesNo[2]={"No","Yes"};
void Yes(int ok=1){cout<<YesNo[ok]<<'\n';}


template<class t,class u> void chmax(t&a,u b){if(a<b)a=b;}
template<class t,class u> void chmin(t&a,u b){if(b<a)a=b;}
template<typename T> void o(const T&x){cout<<x;r();}
template<class T>
istream &operator>>(istream &is,vector<T>&v){
    for(T &t:v){
        is>>t;
    }
    return is;
}

int gcd(int a,int b){
    return b?gcd(b,a%b):a;
}

int lcm(int a,int b){
    return a/gcd(a,b)*b;
}

ull powm(ull a,ull b,ull mod){
    ull p=a,ans=1;
    for(int i=0;i<60;++i){
        if((b&(1ll<<i))!=0){
            ans*=p;ans%=mod;
        }
        p*=p;p%=mod;
    }
    return ans;
}

struct UnionFind{
    vector<int> par,rank,siz;
    UnionFind(int no):par(no,-1),rank(no,0),siz(no,1){  }

    int root(int x){
        if(par[x]==-1)return x;
        else return par[x]=root(par[x]);
    }
    bool same(int x,int y){
        return root(x)==root(y);
    }
    bool _union(int x,int y){
        int rx=root(x),ry=root(y);
        if(rx==ry)return false;
        if(rank[rx]<rank[ry])swap(rx,ry);
        par[ry]=rx;
        if(rank[rx]==rank[ry])++rank[rx];
        siz[rx]+=siz[ry];
        return true;
    }
    int size(int x){
        return siz[root(x)];
    }
};

struct segki{
    int size=1;
    vector<int> seg;

    void b(int sz){
        while(size<=sz)size*=2;
        seg.resize(size*2,INF);
    }
    void update(int pos,int x){
        pos+=size;
        seg[pos]=x;
        while(pos>=1){
            pos>>=1; // mid
            seg[pos]=min(seg[pos*2],seg[pos*2+1]);
        }
    }
    int _query(int l,int r,int a,int b,int pos){
        if(l<=a&&b<=r)return seg[pos];
        if(r<=a||b<=l)return INF;
        int x=_query(l,r,a,(a+b)/2,pos*2);
        int y=_query(l,r,(a+b)/2,b,pos*2+1);
        return min(x,y);
    }
    int query(int l,int r){
        return _query(l,r,0,size,1);
    }
};

signed main(){
    int n;cin>>n;
    vector<P> v(n);
    for(int i=0;i<n;++i){
        cin>>v[i].fi>>v[i].se;
    }
    vector<vi> dp(n+1,vi(1111111,-INF));
    dp[0][0]=0;
    for(int i=0;i<n;++i){
        int x=v[i].fi,y=v[i].se;
        for(int j=0;j<=1000000;++j){
            if(j+x<=y)chmax(dp[i+1][j+x],dp[i][j]+1);
            chmax(dp[i+1][j],dp[i][j]);
        }
    }
    int ans=-INF;
    for(int i=0;i<=1000000;++i){
        chmax(ans,dp[n][i]);
    }
    o(ans);
}
accuracy: 0.02857142857142857
time_ms: 30
memory_kb: 141904
final_rank: 18

code_snippet: #include <bits/stdc++.h>    
using namespace std;
using ll=long long;
using dll=long double;
using pq=priority_queue<int,vector<int>,greater<int>>;
using graph=vector<vector<int>>;

#define int ll
#define db dll
#define sbt(x) (x).begin(),(x).end()
#define gyaku(x) reverse(sbt(x))
#define vset(x) x.erase(unique(x.begin(),x.end()),x.end())
#define so(x) sort(x.begin(),x.end())

/* I miss the old Kanye */
#define fi first
#define se second
#define vi vector<int>
#define P pair<int,int>
#define pb push_back
#define r() cout<<'\n'

typedef unsigned long long ull;

const ll mod=1000000007;
const ll modint=998244353;
const ll INF=1LL<<60;
const double pi=3.141592653589793;

const int dx[8] = {1, 0, -1, 0, 1, 1, -1, -1};
const int dy[8] = {0, 1, 0, -1, -1, 1, -1, 1};
// const int dx[4] = {1,0,-1,0}; 
// const int dy[4] = {0,1,0,-1};
const string YesNo[2]={"No","Yes"};
void Yes(int ok=1){cout<<YesNo[ok]<<'\n';}


template<class t,class u> void chmax(t&a,u b){if(a<b)a=b;}
template<class t,class u> void chmin(t&a,u b){if(b<a)a=b;}
template<typename T> void o(const T&x){cout<<x;r();}
template<class T>
istream &operator>>(istream &is,vector<T>&v){
    for(T &t:v){
        is>>t;
    }
    return is;
}

int gcd(int a,int b){
    return b?gcd(b,a%b):a;
}

int lcm(int a,int b){
    return a/gcd(a,b)*b;
}

ull powm(ull a,ull b,ull mod){
    ull p=a,ans=1;
    for(int i=0;i<60;++i){
        if((b&(1ll<<i))!=0){
            ans*=p;ans%=mod;
        }
        p*=p;p%=mod;
    }
    return ans;
}

struct UnionFind{
    vector<int> par,rank,siz;
    UnionFind(int no):par(no,-1),rank(no,0),siz(no,1){  }

    int root(int x){
        if(par[x]==-1)return x;
        else return par[x]=root(par[x]);
    }
    bool same(int x,int y){
        return root(x)==root(y);
    }
    bool _union(int x,int y){
        int rx=root(x),ry=root(y);
        if(rx==ry)return false;
        if(rank[rx]<rank[ry])swap(rx,ry);
        par[ry]=rx;
        if(rank[rx]==rank[ry])++rank[rx];
        siz[rx]+=siz[ry];
        return true;
    }
    int size(int x){
        return siz[root(x)];
    }
};

struct segki{
    int size=1;
    vector<int> seg;

    void b(int sz){
        while(size<=sz)size*=2;
        seg.resize(size*2,INF);
    }
    void update(int pos,int x){
        pos+=size;
        seg[pos]=x;
        while(pos>=1){
            pos>>=1; // mid
            seg[pos]=min(seg[pos*2],seg[pos*2+1]);
        }
    }
    int _query(int l,int r,int a,int b,int pos){
        if(l<=a&&b<=r)return seg[pos];
        if(r<=a||b<=l)return INF;
        int x=_query(l,r,a,(a+b)/2,pos*2);
        int y=_query(l,r,(a+b)/2,b,pos*2+1);
        return min(x,y);
    }
    int query(int l,int r){
        return _query(l,r,0,size,1);
    }
};

signed main(){
    int n;cin>>n;
    vector<P> v(n);
    for(int i=0;i<n;++i){
        cin>>v[i].fi>>v[i].se;
    }
    sort(sbt(v),[&](P x,P y){return x.se<y.se;});
    vector<vi> dp(n+1,vi(1111111,-INF));
    dp[0][0]=0;
    for(int i=0;i<n;++i){
        int x=v[i].fi,y=v[i].se;
        for(int j=0;j<=1000000;++j){
            if(j+x<=y)chmax(dp[i+1][j+x],dp[i][j]+1);
            chmax(dp[i+1][j],dp[i][j]);
        }
    }
    int ans=-INF;
    for(int i=0;i<=1000000;++i){
        chmax(ans,dp[n][i]);
    }
    o(ans);
}
accuracy: 1
time_ms: 40
memory_kb: 159340
final_rank: 12

code_snippet: //#include <bits/stdc++.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <utility>

typedef long long ll;

using namespace std;


const ll mod=1000000000+7;


//ll dp[1001][1000001];

vector<pair<ll,ll> > vp;



bool comparep(pair<ll,ll> a,pair<ll,ll> b){

      if(a.second!=b.second){
            return a.second<b.second;
            
        }else{
            return a.first<b.first;
        
        }
 } 


int main(){

    int N;
    cin>>N;

    ll a,b;

 

    for(int i=0;i<N;i++){

        cin>>a>>b;

        if(a>b)continue;

        vp.push_back(make_pair(a,b));
    }

    sort(vp.begin(),vp.end(),comparep);
   

/*
    for(ll i=0;i<vp.size();i++){
        cout<<vp[i].first<<":"<<vp[i].second<<endl;
    }
*/

    ll vsize=vp.size();

    if(vsize==0){
        cout<<0<<endl;
        return 0;
    }

    ll last=vp[vsize-1].second;

 //   cout<<"last:"<<last<<endl;

    vector<vector<ll> > dp(vsize+1,vector<ll>(last+1,0));

    for(ll i=0;i<vsize;i++){
        for(ll j=0;j<=last;j++){
            if(j<vp[i].first){
                dp[i+1][j]=dp[i][j];
            }else if(j>=vp[i].first){
                if(j<=vp[i].second){
                    dp[i+1][j]=max(dp[i][j-vp[i].first]+1,dp[i][j]);
                }else{
                    dp[i+1][j]=max(dp[i+1][vp[i].first],max(dp[i][j-vp[i].first],dp[i][j]));
                }
                
            }
        }
    }
/*
    for(ll i=0;i<=vsize;i++){                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
        for(ll j=0;j<=vp[vsize-1].second;j++){
            cout<<dp[i][j]<<" ";
        }
        cout<<endl;
    }
    */
/*
   for(int i=0;i<vsize;i++){
       cout<<dp[i][last]<<endl;
   }
  */
    cout<<dp[vsize][last]<<endl;

    

}
accuracy: 0.42857142857142855
time_ms: 70
memory_kb: 137628
final_rank: 14

code_snippet: //#include <bits/stdc++.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <utility>

typedef long long ll;

using namespace std;


const ll mod=1000000000+7;


//ll dp[1001][1000001];

vector<pair<ll,ll> > vp;



bool comparep(pair<ll,ll> a,pair<ll,ll> b){

      if(a.second!=b.second){
            return a.second<b.second;
            
        }else{
            return a.first<b.first;
        
        }
 } 


int main(){

    int N;
    cin>>N;

    ll a,b;

 

    for(int i=0;i<N;i++){

        cin>>a>>b;

        if(a>b)continue;

        vp.push_back(make_pair(a,b));
    }

    sort(vp.begin(),vp.end(),comparep);
   

/*
    for(ll i=0;i<vp.size();i++){
        cout<<vp[i].first<<":"<<vp[i].second<<endl;
    }
*/

    ll vsize=vp.size();

    if(vsize==0){
        cout<<0<<endl;
        return 0;
    }

    ll last=vp[vsize-1].second;

 //   cout<<"last:"<<last<<endl;

    vector<vector<ll> > dp(vsize+1,vector<ll>(last+1,0));

    for(ll i=0;i<vsize;i++){
        for(ll j=0;j<=last;j++){
            if(j<vp[i].first){
                dp[i+1][j]=dp[i][j];
            }else{
                dp[i+1][j]=max(dp[i][j-vp[i].first]+1,dp[i][j]);
            }
        }
    }
/*
    for(ll i=0;i<=vsize;i++){
        for(ll j=0;j<=vp[vsize-1].second;j++){
            cout<<dp[i][j]<<" ";
        }
        cout<<endl;
    }
    */
/*
   for(int i=0;i<vsize;i++){
       cout<<dp[i][last]<<endl;
   }
  */
    cout<<dp[vsize][last]<<endl;

    

}
accuracy: 0.14285714285714285
time_ms: 40
memory_kb: 88168
final_rank: 16

code_snippet: #include <iostream>
#include <algorithm>
#include <vector>
#include <utility>

typedef long long ll;

using namespace std;


const ll mod=1000000000+7;


//ll dp[1001][1000001];

vector<pair<ll,ll> > vp;



bool comparep(pair<ll,ll> a,pair<ll,ll> b){

      if(a.second!=b.second){
            return a.second<b.second;
            
        }else{
            return a.first<b.first;
        
        }
 } 


int main(){

    int N;
    cin>>N;

    ll a,b;

 

    for(int i=0;i<N;i++){

        cin>>a>>b;

        if(a>b)continue;

        vp.push_back(make_pair(a,b));
    }

    sort(vp.begin(),vp.end(),comparep);
   

/*
    for(ll i=0;i<vp.size();i++){
        cout<<vp[i].first<<":"<<vp[i].second<<endl;
    }
   */ 

    ll vsize=vp.size();

    if(vsize==0){
        cout<<0<<endl;
        return 0;
    }

    ll last=vp[vsize-1].second;

    vector<vector<ll> > dp(vsize+1,vector<ll>(last+1,0));

    for(ll i=0;i<vsize;i++){
        for(ll j=0;j<=last;j++){
            if(j<vp[i].first){
                dp[i+1][j]=dp[i][j];
            }else{
                dp[i+1][j]=dp[i][j-vp[i].first]+1;
            }
        }
    }
/*
    for(ll i=0;i<=vsize;i++){
        for(ll j=0;j<=vp[vsize-1].second;j++){
            cout<<dp[i][j]<<" ";
        }
        cout<<endl;
    }
    */
  
    cout<<dp[vsize][vp[vsize-1].second]<<endl;

    

}
accuracy: 0.11428571428571428
time_ms: 30
memory_kb: 79896
final_rank: 17

code_snippet: #include <iostream>
#include <algorithm>
using namespace std;
int n, a[1009], b[1009], dp[1000009];
int main() {
	cin >> n;
	for (int i = 0; i < n; i++) cin >> a[i] >> b[i];
	for (int i = 0; i < n; i++) {
		for (int j = i + 1; j < n; j++) {
			if (b[i] > b[j]) {
				swap(a[i], a[j]);
				swap(b[i], b[j]);
			}
		}
	}
	for (int i = 0; i < n; i++) {
		for (int j = b[i]; j >= a[i]; j--) {
			dp[j] = max(dp[j], dp[j - a[i]] + 1);
		}
	}
	cout << *max_element(dp, dp + 1000001) << endl;
	return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 6876
final_rank: 9

code_snippet: #include<iostream>
#include<vector>
#include<algorithm>
#include <iterator>
#include<queue>
#include <functional>
#include <string>
#include <numeric>
#include<stack>
using namespace std;
#define REP(i,n) for(int i=0;i<(n);i++)
#define ALL(v) v.begin(),v.end()
using namespace std;


struct prog{
	int mytime;
	int limtime;
};


int main(){

	int N;
	cin >>N;
	vector<prog>progCol(N);
	int sum=0;
	REP(i, N){
		int a, b;
		
		cin >> a >> b;
		sum = max(sum,b);
		progCol[i] = { a, b };
	}
	vector<vector<int>>dp(sum+3, vector<int>(N));
	sort(progCol.begin(), progCol.end(), [](prog p1, prog p2){return p1.limtime < p2.limtime; });
	REP(i, sum+1){
		REP(j, N){
			if (progCol[j].mytime > progCol[j].limtime){
				continue;
			}
			if (i < progCol[j].mytime){ dp[i][j] = 0; }
			else if (i == progCol[j].mytime){
				dp[i][j] = 1;
			}
			else{
				int temp = dp[i-1][j];
				if (progCol[j].mytime <= i){
					REP(k, j){
						if (progCol[j].limtime >= i){
							temp = max(temp, dp[i - progCol[j].mytime][k] + 1);
						}
					}
				}
				dp[i][j] = temp;
			}
		}
	}
	cout << (*max_element(dp[sum].begin(), dp[sum].end())) << endl;
	return 0;
}
accuracy: 1
time_ms: 190
memory_kb: 102484
final_rank: 13

code_snippet: #include<iostream>
#include<vector>
#include<algorithm>
#include <iterator>
#include<queue>
#include <functional>
#include <string>
#include <numeric>
#include<stack>
using namespace std;
#define REP(i,n) for(int i=0;i<(n);i++)
#define ALL(v) v.begin(),v.end()
using namespace std;


struct prog{
	int mytime;
	int limtime;
};


int main(){

	int N;
	cin >>N;
	vector<prog>progCol(N);
	int sum=0;
	REP(i, N){
		int a, b;
		
		cin >> a >> b;
		sum = max(sum,b);
		progCol[i] = { a, b };
	}
	vector<vector<int>>dp(sum+3, vector<int>(N));
	sort(progCol.begin(), progCol.end(), [](prog p1, prog p2){return p1.limtime < p2.limtime; });
	REP(i, sum){
		REP(j, N){
			if (progCol[j].mytime > progCol[j].limtime){
				continue;
			}
			if (i < progCol[j].mytime){ dp[i][j] = 0; }
			else if (i == progCol[j].mytime){
				dp[i][j] = 1;
			}
			else{
				int temp = dp[i-1][j];
				if (progCol[j].mytime <= i){
					REP(k, j){
						if (progCol[j].limtime >= i){
							temp = max(temp, dp[i - progCol[j].mytime][k] + 1);
						}
					}
				}
				dp[i][j] = temp;
			}
		}
	}
	cout << (*max_element(dp[sum - 1].begin(), dp[sum - 1].end())) << endl;
	return 0;
}
accuracy: 0.2857142857142857
time_ms: 160
memory_kb: 101956
final_rank: 15

code_snippet: #include <iostream>
#include <sstream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <cstring>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <bitset>
#include <numeric>
#include <utility>
#include <iomanip>
#include <algorithm>
#include <functional>
using namespace std;

typedef long long ll;
typedef vector<int> vint;
typedef vector<long long> vll;
typedef pair<int,int> pint;
typedef pair<long long, long long> pll;

#define MP make_pair
#define PB push_back
#define ALL(s) (s).begin(),(s).end()
#define EACH(i, s) for (__typeof__((s).begin()) i = (s).begin(); i != (s).end(); ++i)
#define COUT(x) cout << #x << " = " << (x) << " (L" << __LINE__ << ")" << endl

template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
template<class T1, class T2> ostream& operator << (ostream &s, pair<T1,T2> P) 
{ return s << '<' << P.first << ", " << P.second << '>'; }
template<class T> ostream& operator << (ostream &s, vector<T> P) 
{ for (int i = 0; i < P.size(); ++i) { if (i > 0) { s << " "; } s << P[i]; } return s; }
template<class T> ostream& operator << (ostream &s, vector<vector<T> > P) 
{ for (int i = 0; i < P.size(); ++i) { s << endl << P[i]; } return s << endl; }
template<class T1, class T2> ostream& operator << (ostream &s, map<T1,T2> P) 
{ EACH(it, P) { s << "<" << it->first << "->" << it->second << "> "; } return s; }

int N;
pll list[2100];

const long long INF = 1LL<<60;
long long dp[2100][2100];

int main() {
    //freopen( "/Users/macuser/Dropbox/Contest/input.in", "r", stdin );
    while (cin >> N) {
        for (int i = 0; i < N; ++i) cin >> list[i].second >> list[i].first;
        sort(list, list+N);
        
        for (int i = 0; i < 2100; ++i) for (int j = 0; j < 2100; ++j) dp[i][j] = INF;
        dp[0][0] = 0;
        
        int res = 0;
        for (int i = 0; i <= N; ++i) {
            for (int j = 0; j <= N; ++j) {
                if (dp[i][j] < INF) chmax(res, j);
                                         
                long long alt = dp[i][j] + list[i].second;
                if (alt <= list[i].first) {
                    chmin(dp[i+1][j+1], alt);
                }
                chmin(dp[i+1][j], dp[i][j]);
            }
        }
        
        cout << res << endl;
    }
    return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 35660
final_rank: 11

code_snippet: #include<stdio.h>
#include<map>
#include<vector>
#include<algorithm>
struct S{
	int a,b;
	bool operator<(const S& s)const{
		return b<s.b;
	}
};

int main(){
	int n,a,b,ans=0;
	std::map<int,int> memo,nextMemo;
	memo[0]=0;
	scanf("%d",&n);
	S s;
	std::vector<S> vec;
	for(int i=0;i<n;i++){
		scanf("%d %d",&s.a,&s.b);
		vec.push_back(s);
	}
	std::sort(vec.begin(),vec.end());
	for(int i=0;i<vec.size();i++){
		a=vec[i].a;
		b=vec[i].b;
		for(std::map<int,int>::iterator it=memo.begin();it!=memo.end();it++){
			int t=(*it).first+a;
			int t2=(*it).second+1;
			
			int t3;
			if(t>b)break;
			if(memo.find(t)==memo.end()){
				if(nextMemo.find(t)==nextMemo.end()||nextMemo[t]<t2)nextMemo[t]=t2;
				t3=t2>nextMemo[t]?t2:nextMemo[t];
			}else if(memo[t]<t2){
				memo[t]=t2;
				t3=t2;
			}else{
				t3=memo[t];
			}
			if(ans<t3)ans=t3;
		}
		memo.insert(nextMemo.begin(),nextMemo.end());
		nextMemo.clear();
	}
	printf("%d\n",ans);
}
accuracy: 1
time_ms: 30
memory_kb: 5496
final_rank: 10

code_snippet: #include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

typedef pair<int,int> P;

// A[i] := i ツ氾板姪堋づ個姪「ツ妥ィツづーツ嘉ーツつュツづ個づ可つゥツつゥツづゥツ篠楪甘?
int A[16] = {0};
int ans = 0;

void solve(vector<P> v, int pos, int total, int AC){
	if( pos == v.size() ){
		ans = max( ans , AC );
		return ;
	}
	
	int time = v[pos].first;
	int i = v[pos].second;
	if( total + A[i] <= time ){
		solve( v , pos+1 , total + A[i] , AC+1 );
	}
	solve( v , pos+1 , total , AC );
}

int main(){
	int n;
	vector<P> v;
	
	cin >> n;
	for(int i=0 ; i < n ; i++ ){
		int a, b;
		cin >> a >> b;
		A[i] = a;
		v.push_back( P(b,i) );
	}
	sort( v.begin() , v.end() );
	solve( v , 0 , 0 , 0 );
	cout << ans << endl;
}
accuracy: 1
time_ms: 10
memory_kb: 0
final_rank: 1

code_snippet: #include <iostream>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

typedef pair<int,int> P;

// A[i] := i 番目の問題を解くのにかかる時間
int A[16] = {0};
int ans = 0;

void solve(vector<P> v, int pos, int total, int AC){
	if( pos == v.size() ){
		ans = max( ans , AC );
		return ;
	}
	
	int time = v[pos].first;
	int i = v[pos].second;
	if( total + A[i] <= time ){
		solve( v , pos+1 , total + A[i] , AC+1 );
	}
	solve( v , pos+1 , total , AC );
}

int main(){
	int n;
	vector<P> v;
	
	cin >> n;
	for(int i=0 ; i < n ; i++ ){
		int a, b;
		cin >> a >> b;
		A[i] = a;
		v.push_back( P(b,i) );
	}
	sort( v.begin() , v.end() );
	solve( v , 0 , 0 , 0 );
	cout << ans << endl;
}
accuracy: 1
time_ms: 10
memory_kb: 0
final_rank: 1

code_snippet: #include <iostream>
#include <fstream>
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cctype>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <iomanip>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <sstream>
#include <string>
#include <vector>
using namespace std;

#define EPS 1e-9
#define INF MOD
#define MOD 1000000007LL
#define fir first
#define iss istringstream
#define sst stringstream
#define ite iterator
#define ll long long
#define mp make_pair
#define rep(i,n) rep2(i,0,n)
#define rep2(i,m,n) for(int i=m;i<n;i++)
#define pi pair<int,int>
#define pb push_back
#define sec second
#define sh(i) (1LL<<i)
#define sz size()
#define vi vector<int>
#define vc vector
#define vl vector<ll>
#define vs vector<string>

int n,dp[1010][1010];
pi p[1010];

int f(int c,int a){
	int& r=dp[c][a];
	if(r<INF)return r;
	if(!c)return r=a?INF:0;
	if(!a)return r=0;
	r=f(c-1,a);
	if(f(c-1,a-1)+p[c-1].sec<=p[c-1].fir)r=min(r,f(c-1,a-1)+p[c-1].sec);
	return r;
}

int main(){
	cin>>n;
	rep(i,n)cin>>p[i].sec>>p[i].fir;
	sort(p,p+n);
	rep(i,n+1)rep(j,n+1)dp[i][j]=INF;
	for(int i=n;;i--)if(f(n,i)<INF){
		cout<<i<<endl;
		break;
	}
}
accuracy: 1
time_ms: 10
memory_kb: 0
final_rank: 1

code_snippet: #include<iostream>
#include<algorithm>
using namespace std;

int main(){
  int a[1000],b[1000];
  int p[1000000];
  int n,tmp,ans;

  cin >> n;
  for(int i=0;i<n;i++)cin >> a[i] >> b[i];
  for(int i=0;i<n-1;i++){
    for(int j=i+1;j<n;j++){
      if(b[i] > b[j]){
	swap(a[i],a[j]);
	swap(b[i],b[j]);
      }
    }
  }

  p[0] = 0;
  for(int i=1;i<=b[n-1];i++)p[i] = -1;

  for(int i=0;i<n;i++){
    for(int j=b[i]-a[i];j>=0;j--){
      if(p[j]>=0){
	if(p[j+a[i]]<p[j]+1)p[j+a[i]] = p[j]+1;
      } 
    }
  }

  ans = 0;
  for(int i=0;i<=b[n-1];i++){
    if(ans<p[i])ans = p[i];
  }

  cout << ans << endl;
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 0
final_rank: 1

code_snippet: #include<iostream>
using namespace std;

int main(){
  int n;
  int a[1000],b[1000];
  int p[1000000];
  int tmp,ans;

  cin >> n;
  for(int i=0;i<n;i++){
    cin >> a[i] >> b[i];
  }

  for(int i=0;i<n-1;i++){
    for(int j=i+1;j<n;j++){
      if(b[i] > b[j]){
	tmp = a[i];
	a[i] = a[j];
	a[j] = tmp;
	tmp = b[i];
	b[i] = b[j];
	b[j] = tmp;
      }
    }
  }

  p[0] = 0;
  for(int i=1;i<=b[n-1];i++)p[i] = -1;

  for(int i=0;i<n;i++){
    for(int j=b[i]-a[i];j>=0;j--){
      if(p[j]>=0){
	if(p[j+a[i]]<p[j]+1)p[j+a[i]] = p[j]+1;
      } 
    }
  }

  ans = 0;
  for(int i=0;i<=b[n-1];i++){
    if(ans<p[i])ans = p[i];
  }

  cout << ans << endl;
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 0
final_rank: 1

code_snippet: #include<cstdio>
#include<algorithm>

#define rep(i,n) for(int i=0;i<(n);i++)

using namespace std;

typedef pair<int,int> pii;

int main(){
	int n; scanf("%d",&n);
	pii p[1000];
	rep(i,n) scanf("%d%d",&p[i].second,&p[i].first);

	sort(p,p+n);

	static int dp[1000001];
	rep(i,n){
		int a=p[i].second,b=p[i].first;
		for(int t=b;t>=max(a,0);t--) dp[t]=max(dp[t],dp[t-a]+1);
	}
	printf("%d\n",*max_element(dp,dp+1000001));

	return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 0
final_rank: 1

code_snippet: #define _USE_MATH_DEFINES
#include <iostream>
#include <complex>
#include <algorithm>
#include <vector>
#include <stack>
#include <string>
#include <queue>
#include <cmath>
#include <math.h>
#include <numeric>
#include <list>
#include <sstream>
#include <fstream>
#include <iomanip>
#include <climits>
#include <set>
#include <memory.h>
#include <memory>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cassert>
#include <map>
#include <cassert>
#include <time.h>
#include <ctime>

using namespace std;

typedef complex<double> xy_t;
typedef pair<xy_t, xy_t> line;
typedef vector<xy_t> polygon;
typedef long long ll;
typedef pair<int, int> P;
typedef pair<int , P> PP;
typedef pair<string, int> Ps;
typedef vector<int> vec;
typedef vector<vec> mat;
const int INF = 1 << 29;
const double EPS = 1e-10;
const double PI = 3.1415926535897932384626433832795;
const int CLK = CLOCKS_PER_SEC;

#define rep(i, n) for(int i = 0; i < n; i++)
#define rep2(i, m, n) for(int i = m; i < n; i++)
#define repD(i, n) for(int i = n; i >= 0; i--)

int n;
ll dp[1010][1010];
P prob[2000];

int main(){
	cin >> n;
	for(int i = 0;i < n; i++){
		cin >> prob[i].second >> prob[i].first;
	}
	sort(prob, prob + n);
	fill(&dp[0][0], &dp[1009][1009] + 1, INF);
	for(int i = 0; i <= n; i++){
		dp[i][0] = 0;
	}
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= i; j++){
			if(dp[i-1][j-1] + prob[i-1].second <= prob[i-1].first){
				dp[i][j] = dp[i-1][j-1] + prob[i-1].second;
			}
			if(dp[i-1][j] <= prob[i-1].first){
				dp[i][j] = min(dp[i-1][j], dp[i][j]);
			}
		}
	}
	int res = 0;
	for(int i = 1; i <= n; i++){
		if(dp[n][i] != INF) res = max(res, i);
	}
	cout << res << endl;
	return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 0
final_rank: 1

code_snippet: #include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <math.h>
#include <assert.h>
#include <vector>

using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
static const double EPS = 1e-9;
static const double PI = acos(-1.0);

#define REP(i, n) for (int i = 0; i < (int)(n); i++)
#define FOR(i, s, n) for (int i = (s); i < (int)(n); i++)
#define FOREQ(i, s, n) for (int i = (s); i <= (int)(n); i++)
#define FORIT(it, c) for (__typeof((c).begin())it = (c).begin(); it != (c).end(); it++)
#define MEMSET(v, h) memset((v), h, sizeof(v))

int n;
int ans;
ll dp[1010][1010];
pair<ll, ll> problem[1010];

int main() {
  while (scanf("%d", &n) > 0) {
    MEMSET(dp, 0x01);
    ans = 0;
    REP(i, n) {
      scanf("%lld %lld", &problem[i].second, &problem[i].first);
    }
    sort(problem, problem + n);
    dp[0][0] = 0;
    REP(index, n) {
      FOREQ(solved, 0, index) {
        dp[index + 1][solved] = min(dp[index + 1][solved], dp[index][solved]);
        ll time = dp[index][solved] + problem[index].second;
        if (time <= problem[index].first) {
          ans = max(ans, solved + 1);
          dp[index + 1][solved + 1] = min(dp[index + 1][solved + 1], time);
        }
      }
    }
    printf("%d\n", ans);
  }
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 0
final_rank: 1