密密麻麻的我也不知道哪错了,WA了
#include <bits/stdc++.h>
using namespace std;
/*首先来思考,当我在一个加油站时,我接下去要去另一个加油站,我选择哪一个?
线性地思考,一定是从当前位置找到的第一个比我价格低的那一个。
那为什么不去选择我能到达的范围中的最小的呢,一定是第一个呢。
思考:如果有一个价格更小的加油站在比我第一个更小的加油站后面,那么我的选择应该是从A->B->C,
而非是从A->C,所以选择第一个一定是最优的;
如果没有更小的在范围里呢?
也很好思考,加满当前加油站便宜的油,去范围中最便宜的就行了 */
double D,C,D2,P,ans;
int flag=0;
int N,num;
double minn=(1<<30);
double dis_can;//当前油量可以走的路程
struct st{
double D;
double P;
}str[10];
int main(){
cin>>D>>C>>D2>>P>>N;
str[1].D=0,str[1].P=P;//把出发点看成第一个加油站。
for(int i=1;i<=N;i++){
cin>>str[i+1].D>>str[i+1].P;
}
for(int i=1;i<=N+1;i++){
for(int j=i+1;j<=N+1;j++){
if(str[j].D-str[i].D>C*D2&&j==i+1){//如果第一个都到不了,无解
cout<<"No Solution"<<endl;
return 0;
}
if(str[j].D-str[i].D<=C*D2&&str[j].P<str[i].P)//从i到j,是合法的,又比我小。
{
flag=1;//标记,告诉后面找到了
if(dis_can<str[j].D-str[i].D)ans+=(str[j].D-str[i].D-dis_can)/(D2*str[i].P);//更新答案
else dis_can-=(str[j].D-str[i].D);
i=j;//来到这个加油站。
break;
}
}
if(flag==0){//没有
int j;
for(j=i+1;j<=N+1;j++)
if(str[j].D-str[i].D<=C*D2&&str[j].P<minn){minn=str[j].P,num=j;}
ans+=(C*D2-dis_can)/(D2*str[i].P);
dis_can=C*D2-(str[j].D-str[i].D);//加满 ,并到达
i=j;//来到这
}
flag=0;
minn=(1<<30);
}
printf("%.2f",ans);
return 0;
}