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

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

#include
#include
#include
#include
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);
   
   }  
}

你可能感兴趣的:(pat)