/** * Sample solution for Roller Coaster * Steven J Zeil, 10/23/2010 */ #include #include #include #include #include using namespace std; /** * Process a single dataset for the problem. * Return true if successful. Return false if we encounter the * end of input marker or an unreocverable I/O error, */ bool processDataSet (istream& in) { int N, K; long L; in >> N >> K >> L; if (N == 0) return false; long dizzyLimit = L + 1L; int fun[1000]; int dizzy[1000]; for (int i = 0; i < N; ++i) in >> fun[i] >> dizzy[i]; // Dynamic programming setup: f[i] is minimum dizziness possible // while achieving fun=i long* oldf = new long[20*N+1]; long * newf = new long[20*N+1]; fill_n (oldf, 20*N+1, dizzyLimit); oldf[0] = 0; int maxFunSoFar = 0; for (int track = 0; track < N; ++track) { fill_n (newf, 20*N+1, dizzyLimit); for (int i = 0; i <= maxFunSoFar; ++i) { if (oldf[i] < dizzyLimit) { // If Bessie keeps her eyes open int newFun = i + fun[track]; long newDizzy = min (oldf[i] + (long)(dizzy[track]), dizzyLimit); newf[newFun] = min(newf[newFun], newDizzy); // If Bessie closes her eyes newFun = i; newDizzy = max(oldf[i] - (long)K, 0L); newf[newFun] = min(newf[newFun], newDizzy); } } //copy (newf, newf+20*N+1, ostream_iterator(cout, " ")); //cout << endl; maxFunSoFar = maxFunSoFar + fun[track]; swap (oldf, newf); } for (int i = 20*N; i >= 0; --i) if (oldf[i] < dizzyLimit) { cout << i << endl; break; } delete [] oldf; delete [] newf; return true; } void rollerCoaster (istream& in) { bool finished = false; while (!finished) { finished = !processDataSet(in); } } int main (int argc, char** argv) { // Program should normally read from standard in. But // for debugging purposes, it is sometimes easier to // give a file name on the command line. if (argc > 1) { ifstream in (argv[1]); rollerCoaster (in); } else rollerCoaster(cin); return 0; }