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;
} 

猜你喜欢

转载自blog.csdn.net/qq_46527915/article/details/120388787