POK 2431

初めてナンバリングついた問題のコードをのせれる
と思ったらgotoとかいう闇の魔法使ってて相変わらずあふれる残念臭
これも蟻本です あのガソリンスタンドのやつ
アルゴリズムは覚えてたのだが脅威の実装力の低さにより時間かかった上に暗黒コード
修行すなぁ

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <cassert>
#include <fstream>
#include<math.h>
 
#define FOR(i,k,n)      for (int i=(k); i<(int)(n); ++i)
#define REP(i,n) FOR(i,0,n)
#define FORIT(i,c)      for(__typeof((c).begin())i=(c).begin();i!=(c).end();++i)
#define sz       size()
#define lgt      length()
#define pb       push_back
#define mp       make_pair
#define ALL(X)   (X).begin(),(X).end()
#define SORT(a)  sort(ALL(a));
 
 
using namespace std;
 
typedef pair<int,int> pint;
typedef vector<int> vi;
typedef vector<string>  vs;
typedef vector<vi>       vvi;
 
 
int toInt(string s){int v;istringstream sin(s);sin>>v;return v;}
double toDouble(string s){double v;istringstream sin(s);sin>>v;return v;}
template<class T>string toString(T x){ostringstream sout;sout<<x;return sout.str();}
vs form(string a,char s){a+=s;vs v;string b;REP(i,a.lgt){if(a[i]==s){v.pb(b);b="";}else b+=a[i];}return v;}
vi formint(string a,char s){a+=s;vi v;string b;REP(i,a.lgt){if(a[i]==s){v.pb(toInt(b));b="";}else b+=a[i];}return v;}
 
int main(){
        int N;
        vector<int> a;
        vector<int> b;
        cin >> N;
        REP(i,N){
                int in,input;
                cin >> in >> input;
                a.push_back(in);
                b.push_back(input);
        }       
        int L,P;
        cin >> L >> P;
        REP(i,(int)a.sz){
                a[i]=L-a[i];
        }
        pint gs[10010];
        REP(j,10010){
                gs[j].first=100000;
                gs[j].second=100000;
        }
        REP(i,N){
                gs[i].first=a[i];
                gs[i].second=b[i];
        }
        //ここまでで、
        //N-スタンド数
        //a[n]-スタートからの各スタンドの数
        //b[n]-ガソリン補給量
        //要するにまぁ蟻本インプット
        priority_queue<int> pq;
        int cunt=0;
        int i=0;
        loop:
        while(1){//「Pまでのやつ全部入れる」ループ
                if(i>=N)break;
                else if(gs[i].first<=P){
                        pq.push(gs[i].second);
                        i+=1;
                }
                else if(gs[i].first>P)break;
        }
        
        if(P>=L)goto fin;//最初から燃料足りてた用
        
        else {
                while(1){
                        P+=pq.top();//とりあえず一番大きい燃料採用
                        cunt+=1;
                        pq.pop();
                        if(P>=L){//それでゴールについたんならめでたい
                                goto fin;
                        }
                        else if(gs[i].first<=P){//それでまぁ最低でも次のgs[i]までとどくんならまたそれをいれなきゃだからループに戻る
                                goto loop;
                        }
                        else if(pq.empty()){//ゴールにも次のgs[i]にも届かないままついにスタンドを使い切ったらゲームオーバーなので-1を出力
                                cunt = -1;
                                goto fin;
                        }
                }
        }               
        fin:
        cout << cunt << endl;
    return 0;
}