1031
#include <vector> #include <list> #include <map> #include <set> #include <deque> #include <queue> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <ctime> #include <math.h> #include <limits.h> using namespace std; #define INPUT_FILE "stairs.in" #define OUTPUT_FILE "stairs.out" long long m[10100] = {0}; long long mm[10100] = {0}; int main(void) { #ifdef ALEX freopen("input.in", "r", stdin); freopen("output.out", "w", stdout); #endif long long l1,l2,l3,c1,c2,c3; long long N; long long s,e,_s,_e; cin >> c1 >> c2 >> c3 >> l1 >> l2 >> l3; cin >> N; cin >> _s >> _e; m[0] = 0; for(int i = 1; i < N; i++) { int t; cin >> t; m[i] = t; mm[i] = -1; } e = max(_e,_s); s = min(_e,_s); e--; s--; mm[s] = 0; long long n1 = s,n2 = s,n3 = s; long long c = s; for(;;) { int k = 0; if(mm[c] != -1) { if(n1 < e) { while(((m[c] + c1) >= m[n1+1]) && ((n1+1) <= e)) { n1++; } } else { k++; } if(n1 > c) { if(mm[n1] == -1) mm[n1] = mm[c] + l1; else mm[n1] = min(mm[n1], mm[c] + l1); } if(n2 < e) { while(((m[c] + c2) >= m[n2+1]) && ((n2+1) <= e)) { n2++; } } else { k++; } if(n2 > c) { if(mm[n2] == -1) mm[n2] = mm[c] + l2; else mm[n2] = min(mm[n2], mm[c] + l2); } if(n3 < e) { while(((m[c] + c3) >= m[n3+1]) && ((n3+1) <= e)) { n3++; } } else { k++; } if(n3 > c) { if(mm[n3] == -1) mm[n3] = mm[c] + l3; else mm[n3] = min(mm[n3], mm[c] + l3); } } if(c == e) break; else c++; if(k == 3) break; else k = 0; } cout << mm[e]; return 0; }
page revision: 0, last edited: 18 Sep 2007 06:26