PAT甲级1033 To Fill or Not to Fill

坑点

(1)必须存在一个距离为0的加油站,否则哪也去不了

测试点4就是过不了,以后再回头看吧,,,

#include<bits/stdc++.h>
using namespace std;
struct Sta{
    double price;
    double dis;
}sta[501];
double cap,d,avg;
int n;
bool cmp(Sta a,Sta b)
{
    return a.dis!=b.dis?a.dis<b.dis:a.price<b.price;
}
int search(int k)
{
    int j=-1;
    double Min=10000000*1.0;
    for(int i=k+1;i<n;i++)
    {
        if((sta[i].dis-sta[k].dis)>cap*avg||sta[i].dis>=d) break;
        if(sta[i].price<sta[k].price)
        {
            j=i;break;
        }
        else{
        	if(sta[i].price<Min)
        	{
        		j=i;Min=sta[i].price;
        	}
        }
    }
    return j;
}
int main()
{
	scanf("%lf%lf%lf%d",&cap,&d,&avg,&n);
    for(int i=0;i<n;i++)
    {
        scanf("%lf%lf",&sta[i].price,&sta[i].dis);
    }
    sort(sta,sta+n,cmp);
    double sum=0.0,tank=0.0;
    if(sta[0].dis!=0.0) printf("The maximum travel distance = 0.00");
    else{
        int i=0;
        while(1)
        {
            int j=search(i);
            if(j==-1){
                if(sta[i].dis+cap*avg>=d)
                {
                    sum+=((d-sta[i].dis)/avg-tank)*sta[i].price;
                    printf("%.2f",sum);
                    break;
                }
                else{
                    printf("The maximum travel distance = %.2f",sta[i].dis+cap*avg);break;
                }
            }
            double temp=(sta[j].dis-sta[i].dis)/avg;
            if(sta[j].price<sta[i].price)
            {
                sum+=(temp-tank)*sta[i].price;
				tank=0;
            }else{
            	sum+=sta[i].price*(cap-tank);
				tank=cap-temp;
            }
            i=j;
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值