您的位置:首页 > 其它

PAT 1033. To Fill or Not to Fill

2014-11-23 11:33 99 查看
#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
.first = dist;
stations
.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;
}


写得有点烦
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: