初めてナンバリングついた問題のコードをのせれる
と思ったら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; }