#include class Task { protected: int days; int task_revenue; double probability_of_success; public: Task(); Task( int, int, double = 1.0 ); int time() const; int revenue() const; double probability() const; virtual double priority() const = 0; }; Task::Task(): days( 0 ), task_revenue( 0 ), probability_of_success( 0.0 ) { // Does nothing... } Task::Task( int d, int r, double p ): days( std::max( 0, d ) ), task_revenue( std::max( 0, r ) ), probability_of_success( std::min( std::max( 0.0, p ), 1.0 ) ) { // Does nothing... } int Task::time() const { return days; } int Task::revenue() const { return task_revenue; } double Task::probability() const { return probability_of_success; } class Time : public Task { using Task::days; using Task::task_revenue; public: Time(); Time( int, int, double = 1.0 ); double priority() const; }; Time::Time(): Task( 0, 0, 0.0 ) { // Does nothing... } Time::Time( int d, int r, double p ): Task( d, r, p ) { // Does nothing... } double Time::priority() const { return -Task::time(); } class Revenue : public Task { using Task::days; using Task::task_revenue; public: Revenue(); Revenue( int, int, double = 1.0 ); double priority() const; }; Revenue::Revenue(): Task( 0, 0, 0.0 ) { // Does nothing... } Revenue::Revenue( int d, int r, double p ): Task( d, r, p ) { // Does nothing... } double Revenue::priority() const { return -revenue(); } class Revenue_density : public Task { using Task::days; using Task::task_revenue; public: Revenue_density(); Revenue_density( int, int, double = 1.0 ); double priority() const; }; Revenue_density::Revenue_density(): Task( 0, 0, 0.0 ) { // Does nothing... } Revenue_density::Revenue_density( int d, int r, double p ): Task( d, r, p ) { // Does nothing... } double Revenue_density::priority() const { return -static_cast( revenue() )/static_cast( time() ); }