PAT 1033. To Fill or Not to Fill

#include <cstdio>

#include <cstdlib>

#include <vector>

#include <algorithm>



using namespace std;



int main() {

    int N;

    double mcap, dist, davg; 



    scanf("%lf%lf%lf%d", &mcap, &dist, &davg, &N);

    double price, idist;

    

    vector<pair<double, double> > stations(N + 1);

    for (int i=0; i<N; i++) {

        scanf("%lf%lf", &price, &idist);

        stations[i].first = idist;

        stations[i].second= price;

    }

    

    // virtual station to indicate the end

    stations[N].first = dist;

    stations[N].second= 1e300;

    

    sort(stations.begin(), stations.end());

    

    double tank = 0, cur_dist = 0, cur_price = 0;

    

    if (stations[0].first > 0) {

        printf("The maximum travel distance = %.2lf", cur_dist);

        return 0;

    }

    

    double money     = 0;    

    int cur_stat    = 0;

    int cheap_stat     = -1;

    double cheap_price = 0;

    

    while (cur_dist < dist && (cur_stat) < N) {

        double next_dist = stations[cur_stat + 1].first;

        double max_dist  = mcap * davg + cur_dist;

        // can't reach next station

        if (max_dist < next_dist) {

            cur_dist = max_dist;

            break;

        }

        // can reach next station

        // find first min gas price from cur_stat/cheap_stat within the reach range

        if (cheap_stat < cur_stat) {

            // last cheap station we calculated has past by

            cheap_stat = cur_stat;

            cheap_price= stations[cur_stat].second;

        }

        for (int i=cheap_stat; i<N && stations[i].first <= max_dist; i++) {

            if (stations[i].second < cheap_price) {

                cheap_stat = i;

                cheap_price= stations[i].second;

                break;

            }

        }

        // cheaper station is cur_stat

        if (cheap_stat == cur_stat) {

            // from here we can reach end station

            if (max_dist >= dist) {

                money += cheap_price * (dist - cur_dist) / davg;

                cur_dist = dist;

                break;

            }

            // can't reach the end station

            // we should fill full tank

            money += (mcap - tank) * cheap_price;

            tank = mcap;

        } else {

            // cur_stat is not the cheaper station, 

            // just fill enough gas, go to the cheaper one

            double gas_need = (stations[cheap_stat].first - cur_dist) / davg;

            if (gas_need > tank) {

                // we have to fill gas here

                money += (gas_need - tank) * stations[cur_stat].second;

                tank = gas_need;

            } else {

                // we have the enough gas already

            }

            

        }

        // now we have enough gas

        // drive to the next station

        tank -= (next_dist - cur_dist) / davg;

        cur_stat++;

        cur_dist = next_dist;

    }

    if (cur_dist < dist) {

        printf("The maximum travel distance = %.2lf", cur_dist);

    } else {

        printf("%.2lf", money);

    }

    return 0;

}

写得有点烦

你可能感兴趣的:(pat)