1033 To Fill or Not to Fill (25 分)难度: 难 / 知识点: 模拟 贪心
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1033 To Fill or Not to Fill (25 分)难度: 难 / 知识点: 模拟 贪心相关的知识,希望对你有一定的参考价值。
https://pintia.cn/problem-sets/994805342720868352/problems/994805458722734080
#include<cstdio>
#include<algorithm>
using namespace std;
struct gas
{
double price;
double km;
}g[520];
bool cmp(gas a,gas b)//距离由小到大排
{
return a.km<b.km;
}
int main(void)
{
double max_oil;//最大的油量
double km;//距离
double speed;//速度
int n;//油箱的数目
int i;//循环变量
double maxkm=0; //满油的最远距离
bool flag=true; //判断可不可以到达
double x=0;//不可到达的,最远距离
scanf("%lf%lf%lf%d",&max_oil,&km,&speed,&n);
maxkm=max_oil*speed;//满油的最远距离
for(i=0;i<n;i++)
{
scanf("%lf%lf",&g[i].price,&g[i].km);
}
//哨兵
g[n].price = 0;//数组最后面放置终点,价格为0
g[n].km = km;//终点距离为km
sort(g,g+n,cmp);//按距离从小到大排序
if(g[0].km!=0)//原点没有加油站
{
flag=false;
printf("The maximum travel distance = 0.00\\n");
return 0;
}
else//原点有加油站判断可不可以到达
{
for(i=1;i<n;i++)
{
if(maxkm< (g[i].km-g[i-1].km) )//我的最远距离不能到达下一个加油站。
{
x=g[i-1].km+maxkm;
flag=false;
break;
}
x=g[i].km;
}
if(i==n)//说明我可以到最后一个加油站。
{
if(maxkm < ( km-g[n-1].km) )
{
//最后一个加油站到终点的距离大于我的最大行驶距离
flag=false;
x=g[n-1].km+maxkm;
}
}
}
if(flag)
{
int now=0;//当前所在的加油站编号 初始为0
double now_oil=0;//现在的油量
double money=0;//总的金钱。
while(now<n)
{
int minPrice_index=-1;//最便宜的油的编号
double minPrice=100000;
for(i=now+1;i<=n&&(g[i].km-g[now].km)<=maxkm;i++)//找到可以到达的加油站数目
{
if(g[i].price<minPrice)//下一个站的油比我标记的最低油价的低
{
minPrice=g[i].price;//保存
minPrice_index=i;
if(minPrice<g[now].price)//如果找到第一个比当前便宜的站
break;
}
}
double need=(g[minPrice_index].km-g[now].km)/speed;
if (minPrice < g[now].price)//如果最低加油站的油价,低于当前油价
{
money += (need - now_oil)*g[now].price;//补足need
now_oil = 0;//到达加油站minPrice_index后油箱内油量为0
}
else//如果加油站minPrice_index的油价高于当前油价
{
money += (max_oil - now_oil)*g[now].price;//将油箱加满
//到达加油站k后油箱内油量为Cmax-need
now_oil = max_oil - need;
}
now = minPrice_index;//到达加油站minPrice_index,进入下一层循环
}
printf("%.2lf\\n",money);
}
else
printf("The maximum travel distance = %.2lf\\n",x);
return 0;
}
以上是关于1033 To Fill or Not to Fill (25 分)难度: 难 / 知识点: 模拟 贪心的主要内容,如果未能解决你的问题,请参考以下文章
PAT 1033. To Fill or Not to Fill
1033 To Fill or Not to Fill (25 分)
1033. To Fill or Not to Fill (25)