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)

1033 to fill or not to fill

PAT 1033 To Fill or Not to Fill[dp]

1033. To Fill or Not to Fill (25)