A1033(25)题目在5.17一定要再回顾一次

本题主要是很复杂,自己找到思路,但是写起来到最后还是会卡壳,现在把思路大概顺一下,本题参考了晴神的写法。
首先选择加油站时要根据距离杭州的远近排序,注意,当第一个加油站距离是非0的话,那么起步就不行了,这里是一个判断,起步完成之后,我们可以比较下一站,如果在每次满油能走过的路程中找到比当前价格便宜的,那么应该先加至少能够到达此处的油,如果没有找到比当前价格便宜的,那么应该找这其中最便宜的,先加满油到达此处,如果没有找到,那么说明不能到达,返回当前距离加上满油的行驶距离

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=501;
const int inf=100000000;
struct node
{
   double price;
   double dis;
}a[maxn];
bool cmp(node b,node c){
	return b.dis<c.dis;
}
int main()
{
   double cmax,d,davg;
   int n;
   cin>>cmax>>d>>davg>>n;
   for (int i=0;i<n;i++)
   {
   	scanf("%lf %lf",&a[i].price,&a[i].dis);
   }
   a[n].dis=d;
   a[n].price=0;
   sort (a,a+n,cmp);
   if (a[0].dis>0)
   printf("The maximum travel distance = 0.00");
   else
   {
   	 int now=0;
   	 double ans=0,nowtank=0,max=davg*cmax;
   	 while (now<n)
   	 {
   	 	int k=-1;
   	 	double minprice=inf;
   	    for (int i=now+1;i<=n&&(a[i].dis-a[now].dis<=max);i++)
   	    {
   	    	if (a[i].price<minprice)
   	    	{
   	    	    minprice=a[i].price;
   	    	    k=i;
   	    	    if (a[i].price<a[now].price)
   	    	    break;
			}
		}
		if (k==-1)break;
		double need=(a[k].dis-a[now].dis)/davg;
		if (minprice>=a[now].price)
		{
			ans+=(cmax-nowtank)*a[now].price;
			nowtank=cmax-need;
		}
		else 
		{
			if (nowtank>=need)
			 nowtank-=need;
			 else
			 {
			 	ans+=(need-nowtank)*a[now].price;
			 	nowtank=0;
			 }
		}
		now=k;
     }
     if (now==n)
     printf("%.2f",ans);
     else
    printf("The maximum travel distance = %.2f",a[now].dis+max);
   
   }  
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值