//土尔逊Torson 编写于2023/06/01
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <stdlib.h>
#include <vector>

using namespace std;

struct GasStation {
	double Pi; // the unit gas price
	double Di; // the distance between this station and Hangzhou
};

struct CarAndGoal {
	int Cmax; // the maximum capacity of the tank
	int D; // the distance between Hangzhou and the destination city
	int Davg;// the average distance per unit gas that the car can run
	double MT; // the maximum travel distance
	double CT; // the cheapest total price
	int D_now; // car current station position
	double remain_oil; // remain oil
};

// ranking gas station vector from low distance to long distance
// in the same distance ranking the gas station from low price to high price
bool cmp092(GasStation a, GasStation b) {
	if (a.Di == b.Di) {
		return a.Pi < b.Pi;
	}
	else {
		return a.Di < b.Di;
	}
}

void GetGoCar(CarAndGoal &car7, vector<GasStation> &GS, int n) {
	int CarMax = car7.Cmax*car7.Davg; // the maximum distance car can run with full tank of oil
	car7.D_now = 0;
	car7.remain_oil = 0;
	car7.MT = 0;
	car7.CT = 0;
	int minCar; // car in the traversal process
	if (GS[0].Di != 0) {
		car7.MT = 0;
		car7.CT = 0;
	}
	else {
		while (1) { // use break as condition to stop while loop
			if (car7.D_now + 1 == n) { 
				break; // if next station is the last then stop
			}
			minCar = car7.D_now + 1; // the current in distance reachable most cheap station
			int i, tag = 0;
			// pick station
			for (i = car7.D_now + 1; i < n; ++i) {
				// if the distance from current station to next station longer than 
				// the distance car maximum can go, then it is unreachable
				if (GS[i].Di - GS[car7.D_now].Di > CarMax) {
					break;
				}
				if (GS[i].Pi < GS[car7.D_now].Pi) { // if have cheaper station then goto that
					minCar = i; // the station index is been stored
					tag = 1; // tag that information
					break;
				}
				if (GS[i].Pi < GS[car7.D_now].Pi) {
					minCar = i; // if didn't show up the cheaper station then this is next station
				}
			}
			// update
			if (tag) { // if have lower price station, then goto this station to fill the tank
				double require_oil = (GS[minCar].Di - GS[car7.D_now].Di) / car7.Davg;
				if (require_oil > car7.remain_oil) {// needed oil > remain oil
					car7.CT += (require_oil - car7.remain_oil)*GS[car7.D_now].Pi;
					car7.remain_oil = require_oil;
				}
				car7.remain_oil -= require_oil;
				car7.D_now = minCar;
			}
			else { // if didn't have cheaper station
				if (i == car7.D_now + 1) {// if can't goto next station
					break;
				}
				else if (car7.D - GS[car7.D_now].Di < CarMax) {
					break; // current station can goto terminal and didn't have cheaper station
				}
				// fill the tank full in the current station and then goto the most lower price station, which is the index mincar
				car7.CT += (car7.Cmax - car7.remain_oil)*GS[car7.D_now].Pi;
				car7.remain_oil = car7.Cmax - (GS[minCar].Di - GS[car7.D_now].Di) / car7.Davg;
				car7.D_now = minCar;
			}
		}
		if (car7.D - GS[car7.D_now].Di > CarMax) {
			car7.MT = GS[car7.D_now].Di + CarMax;
		}
		else {
			car7.MT = car7.D;
			double require_oil = (car7.D - GS[car7.D_now].Di) / car7.Davg;
			if (require_oil > car7.remain_oil) {
				car7.CT += (require_oil - car7.remain_oil)*GS[car7.D_now].Pi;
			}
		}
	}
}

int main() {
	CarAndGoal car;
	int n;
	while (scanf("%d%d%d%d", &car.Cmax, &car.D, &car.Davg, &n) != EOF) { // get the car data
		vector<GasStation> GS;
		for (int i = 0; i < n; ++i) { // get the gas station status
			GasStation tmp;
			scanf("%lf%lf", &tmp.Pi, &tmp.Di);
			GS.push_back(tmp);
		}
		// ranking gas station vector from low distance to long distance
		// in the same distance ranking the gas station from low price to high price
		sort(GS.begin(), GS.end(), cmp092);
		GetGoCar(car, GS, n);
		// output the final answer
		if (car.MT < car.D) {
			printf("The maximum travel distance = %.2f\n", car.MT);
		}
		else {
			printf("%.2f\n", car.CT);
		}
	}
	system("pause");
	return EXIT_SUCCESS;
}
//64 位输出请用 printf("%lld")