好好好第五个点没注意oil剩下的一直wa
看了
可能错的不一样,但是注意到oil剩下的 一改一测数据,对了
/*
从当前开始
1.能走到更便宜的,那加到最近的便宜点地方去 直接过去
2.不能那走到能到的比较便宜的,直接过去
显然while循环要比for好
都是正好搞完,不需要记录剩余油量
*/
#include<iostream>
using namespace std;
double d1,c,d2,p,d[10],pr[10],ans;
int n;
int main()
{
scanf("%lf%lf%lf%lf%d",&d1,&c,&d2,&p,&n);//城市距离 油箱容量 每升距离 出发点价格 加油站数量
for(int i=1;i<=n;i++)
{
scanf("%lf%lf",&d[i],&pr[i]);
}
d[0]=0;
pr[0]=p;
d[n+1]=d1;
double max_=c*d2;
for(int i=1;i<=n+1;i++)
{
if(d[i]-d[i-1]>max_)
{
printf("No Solution\n");
return 0;
}
}
double oil=0;//前面剩下的油
int now=0;
while(now<n+1)
{
int t=-1;
for(int i=now+1;i<=n+1&&d[i]-d[now]<=max_;i++)//找能到达的,且价格更低
{
if(pr[i]<pr[now])
{
t=i;
break;//只找第一个剩下后面在处理
}
}
if(t==-1)//能到的地方找不到价格更低的
{//那就找比较低的
double minx=114514.0;
int minn;
for(int i=now+1;i<=n&&d[i]-d[now]<=max_;i++)
{
if(pr[i]<minx)
{
minx=pr[i];
minn=i;
}
}
ans=ans+(c-oil)*pr[now];
oil=c-(d[minn]-d[now])/d2;
now=minn;
}
else//能找到就正好走到
{
ans=ans+((d[t]-d[now])/d2-oil)*pr[now];
oil=0;
now=t;
}
// cout<<ans<<" "<<now<< endl;
}
printf("%.2lf\n",ans);
return 0;
}
ans=ans+((d[t]-d[now])/d2-oil)*pr[now];
这个-oil不能漏