#include int load, len, n, rows; int koko; typedef struct { int w, s; } vehicle; double pole[1010][1010]; int mins[1010][1010]; int valmins[1010][1010]; int prefix[1010]; vehicle vehs[1010]; void Prefix() { prefix[0] = vehs[0].w; for(int i = 1; i < n; i++) { prefix[i] = prefix[i-1]+vehs[i].w; } } void Print() { // for(int i = 0; i < n; i++) // printf("* %d ", prefix[i]); for(int i = 0; i < rows; i++) { for(int j = 0; j < n; j++) printf("%5.2f ", pole[i][j]); printf("\n"); } printf("\n"); } int MinSpeed(int from, int to) { if (valmins[from][to] == koko) return mins[from][to]; else { int min = -1; for(int i = from; i <= to; i++) { if (min == -1 || min > vehs[i].s) min = vehs[i].s; } valmins[from][to] = koko; mins[from][to] = min; return min; } } double Solve() { int i = 0; for(i = 0; i < n; i++) { if (prefix[i] > load) pole[0][i] = 0; else pole[0][i] = len / (double)MinSpeed(0, i)*60; } rows++; // Print(); if (pole[0][n-1] != 0) return pole[0][n-1]; i = 1; int gw; int minsp; double time; for(i = 1; i < n; i++) { for(int j = i; j < n; j++) { pole[i][j] = 0; for(int k = i-1; k < j; k++) { // printf("F: %.1f S: %d\n", pole[i-1][k], prefix[j]-prefix[k]); // printf("Sec: j %d k %d\n", j, k); if (prefix[j] - prefix[k] > load) continue; if (pole[i-1][k] == 0) if (prefix[j] - prefix[k] > load) continue; else break; gw = prefix[j] - prefix[k]; minsp = MinSpeed(k+1, j); time = (len / (double)minsp)*60; // printf("Time: %5.2f %5.2f %5.2f\n", pole[i-1][k], time, pole[i][j]); if (pole[i][j] == 0 || pole[i][j] > time + pole[i-1][k]) pole[i][j] = time + pole[i-1][k]; } } rows++; // Print(); // if (rows == 2) return -1; if (pole[i][n-1] != 0) return pole[i][n-1]; } // Print(); return -1; } int main() { koko = 1; scanf("%d %d %d\n", &load, &len, &n); while(load != 0 || len != 0 || n != 0) { for(int i = 0; i < n; i++) { scanf("%d %d\n", &vehs[i].w, &vehs[i].s); } rows = 0; Prefix(); double time = Solve(); printf("%.1f\n", time); koko++; scanf("%d %d %d\n", &load, &len, &n); } return 0; }