题解:本题主要考查贪心。这题贪心思路很好想,主要还是细心。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
double D1,D2,D0=0,c,n,money=0,l=0,p;
int i,j;
double d[2326],pi[2236];
int main()
{
cin>>D1>>c>>D2>>p>>n;
double mx=D2*c,pimin=2389;
pi[0]=p;
for(i=1;i<=n;i++)cin>>d[i]>>pi[i];
for(i=1;i<=n;i++)if(d[i]-d[i-1]>mx){cout<<"No Solution";return 0;}//相邻
加油站之间的距离超过了mx就无解
j=0;
while(D1-D0!=0)
{
for(i=j+1;d[i]-D0<=mx&&i<=n;i++)if(pi[i]<pimin){pimin=pi[i];j=i;}
if(p>=pimin){money+=((d[j]-D0)/D2-l)*p;l=(d[j]-D0)/D2;}//范围内的加油站所在地
还便宜,那就使加的油刚好到这个加油站
else if(p<pimin&&D1-D0>mx)//范围内的加油站都比自己贵
{
money+=(c-l)*p;
l=c;
}
if(p<pimin&&D1-D0<=mx)
{
money+=((D1-D0)/D2-l)*p;
break;
}
l=l-(d[j]-D0)/D2;
D0=d[j];p=pimin;
pimin=23489;//注意更新数值
}
printf("%.2lf",money);
return 0;
}