PAT-甲级-1033 To Fill or Not to Fill (贪心)
问题描述:
从杭州开车能到任何地方,但是你会路途上你会需要加油,假设你出发时邮箱没有油,路途上每隔一段距离就有一个加油站,但每个加油站价格不同,你需要选择一条最省钱的加油路线
输入输出:
Sample Input 1:
50 1300 12 8 //油箱大小、目的地距离、每单位油能跑多远、加油站总数
6.00 1250
7.00 600
7.00 150
7.10 0
7.20 200
7.50 400
7.30 1000
6.85 300
Sample Output 1:
749.17
Sample Input 2:
50 1300 12 2
7.10 0
7.00 600
Sample Output 2:
The maximum travel distance = 1200.00 //因为哪怕到最后一个加油站加满油,也到不了下一个加油站/目的地
思路:
贪心原则,保证下一步的操作我可能不赚,但永远不会亏
先添加一个目标油站,价格为0,距离为目的距离,然后将所有油站输入后按距离sort
之后,对于每一步选择满油能到的油站范围内比当前油站便宜的那个,只加将油加到能到达那个站,重复这个过程,如果能到达的油站范围内没有比现在便宜的,那就加满油,到范围内比较便宜那个(不一定比目前油站便宜)重复上述过程,直至到达目标油站
这样能保证我们车上的油一定是能到达油站中最便宜的
注意:
- 这里价格浮点数,有浮点数参与的运算,其他值参与运算的也尽量用浮点数
Code:
/*50 1300 12 8
6.00 1250
7.00 600
7.00 150
7.10 0
7.20 200
7.50 400
7.30 1000
6.85 300*/
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define INT_MAX 0x3f3f3f3f
struct sta{
double price;
double dis;
};
bool cmp(sta s1, sta s2)
{
return s1.dis < s2.dis;
}
int main()
{
double tank_size, total_dis, KMPL, sta_size;
cin>>tank_size>>total_dis>>KMPL>>sta_size;
vector<sta>stas;
stas.push_back({0.0, total_dis});
for(int i = 0; i < sta_size; i++)
{
sta temp_s;
cin>>temp_s.price>>temp_s.dis;
stas.push_back(temp_s);
}
sort(stas.begin(), stas.end(), cmp);
/*for(auto c:stas) //cout stas
{
printf("%.2f",c.price);
cout<<' '<<c.dis<<endl;
}*/
double price_now, sum_spend = 0.00;
double dis_now = 0, sta_now = 0, oil_now = 0;
if(stas[0].dis != 0)
{
cout<<"The maximum travel distance = 0.00";
return 0;
}
else
price_now = stas[0].price;
while(dis_now != total_dis)
{
int max_dis_now = tank_size * KMPL + dis_now;
int min_price = INT_MAX, min_price_sta = sta_now;
for(int i = sta_now + 1; i < stas.size(); i++)
{
if(stas[i].dis <= max_dis_now)
if(stas[i].price <= min_price)
{
min_price = stas[i].price;
min_price_sta = i;
if(min_price < price_now) break;
}
}
if(min_price == INT_MAX)
{
cout<<"The maximum travel distance = ";
printf("%.2f", dis_now + tank_size * KMPL);
return 0;
}
if(min_price < price_now)
{
sum_spend += ((stas[min_price_sta].dis - dis_now) / KMPL - oil_now) * price_now;
oil_now = 0;
}
else
{
sum_spend += (tank_size - oil_now )* price_now;
oil_now = tank_size - (stas[min_price_sta].dis - dis_now) / KMPL;
}
dis_now = stas[min_price_sta].dis;
price_now = stas[min_price_sta].price;
sta_now = min_price_sta;
//cout<<sta_now<<endl;
}// while
printf("%.2f", sum_spend);
}
结果:


浙公网安备 33010602011771号