Friday, April 24, 2015

UVa 11935 - Through the Desert

#include <iomanip>
#include <iostream>
#include <string>
using namespace std;

#define ull unsigned long long

enum EventType {
	FUEL_CONSUMPTION, LEAK, GAS_STATION, MECHANIC, GOAL
};

EventType getEventType(const string& event_name) {
	switch (event_name[0]) {
	case 'F':
		return FUEL_CONSUMPTION;
	case 'L':
		return LEAK;
	case 'M':
		return MECHANIC;
	default:
		if (event_name[1] == 'a')
			return GAS_STATION;
		return GOAL;
	}
}

int main() {

	ull fuel_consumption = 0, leaks = 0, previous_kilometers = 0;
	double tank_capacity_needed = 0, gas_used = 0;
	bool end = false;

	while (!end) {
		ull kilometers;
		cin >> kilometers;
		string event_name;
		cin >> event_name;
		EventType event = getEventType(event_name);
		if (event == FUEL_CONSUMPTION || event == GAS_STATION)
			cin >> event_name;

		// add gas used
		ull driven = kilometers - previous_kilometers;
		previous_kilometers = kilometers;
		gas_used += leaks * driven;
		gas_used += (fuel_consumption / 100.0) * driven;

		// update state of car
		switch (event) {
		case FUEL_CONSUMPTION:
			cin >> fuel_consumption;
			if (fuel_consumption == 0)
				end = true;
			break;
		case LEAK:
			leaks++;
			break;
		case MECHANIC:
			leaks = 0;
			break;
		case GAS_STATION:
			if (gas_used > tank_capacity_needed)
				tank_capacity_needed = gas_used;
			gas_used = 0;
			break;
		case GOAL:
			if (gas_used > tank_capacity_needed)
				tank_capacity_needed = gas_used;
			gas_used = 0;
			cout << std::fixed << setprecision(3) << tank_capacity_needed << endl;
			tank_capacity_needed = 0;
			leaks = 0;
			previous_kilometers = 0;
			break;
		}
	}
	return 0;
}

No comments:

Post a Comment