Skip to content

Instantly share code, notes, and snippets.

@m1irka
Created January 8, 2026 13:05
Show Gist options
  • Select an option

  • Save m1irka/f4e1166e3928e1dcadbe8f4c6a968326 to your computer and use it in GitHub Desktop.

Select an option

Save m1irka/f4e1166e3928e1dcadbe8f4c6a968326 to your computer and use it in GitHub Desktop.
#include <iostream>
using namespace std;
class Base {
public:
int people_on_base;
int vehicles_on_base;
double petrol_on_base;
double goods_on_base;
Base(int people, int vehicles, double petrol, double goods)
: people_on_base(people), vehicles_on_base(vehicles),
petrol_on_base(petrol), goods_on_base(goods) {
}
};
class Vehicle {
protected:
double petrol_amount;
double tank_volume;
public:
Vehicle(double petrol, double volume)
: petrol_amount(petrol), tank_volume(volume) {
}
double getTankVolume() { return tank_volume; }
double getPetrolAmount() { return petrol_amount; }
virtual void arrive(Base& b) {
b.vehicles_on_base += 1;
b.people_on_base += 1;
}
virtual bool leave(Base& b) {
if (b.people_on_base < 1) return false;
double need(tank_volume - petrol_amount);
if (b.petrol_on_base < need) return false;
b.petrol_on_base -= need;
petrol_amount = tank_volume;
b.vehicles_on_base -= 1;
b.people_on_base -= 1;
return true;
}
};
class Bus : public Vehicle {
int people;
int max_people;
public:
Bus(int ppl, int maxp, double petrol, double volume)
: Vehicle(petrol, volume), people(ppl), max_people(maxp) {
}
int getPeopleCount() { return people; }
int getMaxPeople() { return max_people; }
void arrive(Base& b) override {
Vehicle::arrive(b);
b.people_on_base += people;
people = 0;
}
bool leave(Base& b) override {
if (!Vehicle::leave(b)) return false;
int to_take(b.people_on_base >= max_people ? max_people : b.people_on_base);
b.people_on_base -= to_take;
people = to_take;
return true;
}
};
class Truck : public Vehicle {
double load;
double max_load;
public:
Truck(double l, double maxl, double petrol, double volume)
: Vehicle(petrol, volume), load(l), max_load(maxl) {
}
double getCurrentLoad() { return load; }
double getMaxLoad() { return max_load; }
void arrive(Base& b) override {
Vehicle::arrive(b);
b.goods_on_base += load;
load = 0;
}
bool leave(Base& b) override {
if (!Vehicle::leave(b)) return false;
double to_take(b.goods_on_base >= max_load ? max_load : b.goods_on_base);
b.goods_on_base -= to_take;
load = to_take;
return true;
}
};
int main() {
Base base(10, 2, 500.0, 20.0);
Bus b(5, 20, 20, 60);
Truck t(10, 15, 30, 80);
cout << "Initial: People " << base.people_on_base
<< " Vehicles " << base.vehicles_on_base
<< " Petrol " << base.petrol_on_base
<< " Goods " << base.goods_on_base << endl;
b.arrive(base);
t.arrive(base);
cout << "After arrivals: People " << base.people_on_base
<< " Vehicles " << base.vehicles_on_base
<< " Petrol " << base.petrol_on_base
<< " Goods " << base.goods_on_base << endl;
b.leave(base);
t.leave(base);
cout << "After departures: People " << base.people_on_base
<< " Vehicles " << base.vehicles_on_base
<< " Petrol " << base.petrol_on_base
<< " Goods " << base.goods_on_base << endl;
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment