1033. To Fill or Not to Fill (25) [贪心算法]
柳神题解:
贪⼼心思想:
0.寻找⽐比⾃自⼰己距离远的,到能够到达的⼤大距离之间的加油站,看他们的油价。如果找到了了更更低价格 的油价,就加油到刚好能到达那个加油站的距离的油,然后去那个更更低价格的加油站(有更更低的我⼀一 分都不不想多花在别的距离上,只加到刚好满⾜足更更低价格的加油站的距离就⾏行行,那样以后的路路程我就可 以以更更低的价格⾏行行驶啦)
1.如果找不不到更更低的,就找尽可能低的油价的加油站,在当前加油站加满油之后过去。因为想要让路路 程上使⽤用的尽可能是低价的油,既然没有⽐比当前更更低价格的了了,就让油箱加到⼤大值,这样能保证利利 益⼤大化,保证⼤大的距离使⽤用的是便便宜的油。
详解见注释和图片:
#include <iostream>
#include <algorithm>
#include <vector>
#include <stdio.h>
using namespace std;
double C, D, d; //C邮箱容量,D总距离,d单位油耗跑的距离
int N;
const int INF = 999999;
struct station
{
double price, dis;
};
vector<station> vec;
bool cmp(station a, station b)
{
return a.dis < b.dis;
}
int main()
{
cin >> C >> D >> d >> N;
for (int i = 0; i < N; i++)
{
station s;
cin >> s.price >> s.dis;
vec.push_back(s);
}
station distination;
distination.dis = D;
distination.price = 0;
vec.push_back(distination);//把目的地也加进去,为了保证逻辑统一
sort(vec.begin(), vec.end(), cmp); //按距离远近排序
double nowdis = 0.0, maxdis = 0.0, nowprice = 0.0,
totalprice = 0.0;
double leftdis = 0.0; //强行跑停时,油箱里面还剩的油够跑的距离
if (vec[0].dis != 0)
cout << "The maximum travel distance = 0.00";
else
nowprice = vec[0].price; //目前价格就是第一个站的价格
while (nowdis < D) //到目的地之前
{
maxdis = nowdis + d * C;
double minPriceDis = 0, minPrice = INF; //最便宜站点的位置,最便宜的具体价格
int flag = 0;
for (int i = 0; i <= N && vec[i].dis < maxdis; i++) //能到达的所有站点 !!!注意要把最后目的地也算进去!
{
if (vec[i].dis <= nowdis) //已经经过了 !!!!注意等于号,不然把自己包括进去,在6.85那里死循环
continue;
if (vec[i].price < nowprice) //比当前更便宜,马上去那个站点(因为哪怕有更便宜的,也可以省一部分了)
{
totalprice += (vec[i].dis - nowdis - leftdis) * nowprice / d; //leftdis 油箱中可能剩了一部分油
leftdis = 0.0; //去到那个更优站点,我需要耗尽目前的全部贵的油更划算
nowprice = vec[i].price;
nowdis = vec[i].dis;
flag = 1; //找到了更便宜的
break;
}
if (vec[i].price < minPrice) //找到范围内最便宜的站点值
{
minPrice = vec[i].price;
minPriceDis = vec[i].dis;
}
}
if (flag == 0 && minPrice != INF) //如果没找到比当前便宜的
{
totalprice += (nowprice * (C - leftdis / d)); //总容量减去剩下的邮箱容量
leftdis = C * d - (minPriceDis - nowdis);
nowprice = minPrice;
nowdis = minPriceDis;
}
if (flag == 0 && minPrice == INF) //找不到新的站点了
{
nowdis += C * d; //跑完油箱里的油就G
printf("The maximum travel distance = %.2f", nowdis);
return 0;
}
}
printf("%.2lf", totalprice);
return 0;
}