文章
2
粉丝
498
获赞
3
访问
15.5k
通用解法
思路:首先在经过每个加油站时,都要确保油箱是满的。我们将不同加油站的油看成是一份加入到油箱中。利用双端队列维护油箱,双端队列的前端装价格低的油,后端装价格高的油。
在从加油站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:记录花费
*/
...
登录后发布评论
暂无评论,来抢沙发