文章

2

粉丝

498

获赞

2

访问

14.2k

头像
可能是最清晰和通用的思路
P1347 浙江大学机试题
发布于2022年1月27日 09:40
阅读数 5.9k

通用解法

思路:首先在经过每个加油站时,都要确保油箱是满的。我们将不同加油站的油看成是一份加入到油箱中。利用双端队列维护油箱,双端队列的前端装价格低的油,后端装价格高的油。

在从加油站i-1驶向加油站i的过程中,优先使用队列前端的油,并进行价格的累加。每经过一个加油站,将该加油站的油价和队列中的油价进行对比,弹出队列中比该加油站价格高的油,然后用该加油站的油填满油箱剩余部分。

以上贪心策略保证了价格低的油可以最先被使用。另外需要注意的一点是,double类型的数字之间,由于精度问题,需要引入eps进行比较。

注意以上策略可以处理油站所在的位置以及cmax,d,davg均不是int类型的情况。

#include <stdio.h>
#include <deque>
#include <algorithm>
using namespace std;

#define eps 1.e-8

pair<double, double> g[505];//加油站<到杭州距离,一升汽油的价格>

int main() {
    double cmax, d, davg;
    int n;
    while (scanf("%lf%lf%lf%d", &cmax, &d, &davg, &n) != EOF) {
        for (int i = 0; i < n; i++)
            scanf("%lf%lf", &g[i].second, &g[i].first);
        g[n++] = make_pair(d, 0.);//终点也看作一个加油站,便于编码
        sort(g, g + n);

        deque<pair<double, double> > q;//模拟油箱<一升汽油的价格,该油的油量>
        /*
        sumDis:记录行驶路程
        oil:记录油箱中剩多少油
        cost:记录花费
        */
     ...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发