(PAT A1033 To Fill or Not to Fill)

题目:

样例:

 

 代码:

#include<stdio.h>
#include<algorithm>
using namespace std;
struct station{
	double P;//每个加油站每单位油价格 
	double D;//每个加油站到杭州的距离 
}st[510];
bool cmp(station a,station b){
	return a.D<b.D;
}
int main(){
	double cmax;//最多油量 
	double d;//总路程
	double davg;//每单位油所走路程
	int n;//加油站数量
	while(scanf("%lf%lf%lf%d",&cmax,&d,&davg,&n)!=EOF){
		for(int i=0;i<n;i++){
			scanf("%lf%lf",&st[i].P,&st[i].D);
		}
		st[n].D=d;
		st[n].P=0;//把终点处看做是一个距离杭州距离为d且价格为0的站点 
		sort(st,st+n,cmp);//将加油站按照距离杭州的远近从大到小排序
		if(st[0].D!=0){//起点根本就没有加油站,汽车无法启动
			printf("The maximum travel distance = 0.00\n");
			break;
		}
		int now=0;//当前所在站点 
		double price=0;//总花费
		double tank=0;//当前油量
		double range=cmax*davg;//续航里程
		while(now<n){
			double min=100000000;
			int k=-1; 
			for(int i=now+1;i<=n&&st[i].D-st[now].D<=range;i++){//在续航里程里找比当前油箱里的油更便宜的油 
				if(st[i].P<min){
					min=st[i].P;
					k=i; //如果一直没有找到比当前价格更低的,直接K最后等于n 
					if(st[now].P>min){//找到比当前价格更低的,退出循环 
						break;
				    }
				}	
			}
			if(k==-1){//k=-1说明连上一个for循环都没进去,说明两个之间距离大于能行驶的距离了 
				break;
			} 
			double need=(st[k].D-st[now].D)/davg;//直达下个目的地所需要的油量
			if(st[now].P>min){//找到价格更低的,直接直达 
				if(tank<need){//如果油不够在当前站补满需要的油 
					price+=(need-tank)*st[now].P;
					tank=0;
				}
				else if(tank>=need){//油够的话直接扣 
					tank=need-tank;
				}
			}
			else{//没有在里程里找到价格更低的,先在当前站加满油 
				price+=(cmax-tank)*st[now].P;
				tank=cmax-need;
			} 
			now=k;
		} 
		if(now==n){
			printf("%.2f\n",price);
		}
		else{
			printf("The maximum travel distance = %.2f\n",st[now].D+range);
		}
	}
	 
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值