样例输出 33.32
#include<bits/stdc++.h>
using namespace std;
typedef double dou;
dou c,d1,d2;//同题意
dou dis;//油箱满时能行驶的距离
dou ans=0.0;
int n;
dou nc=0.0;//现在油量
struct node{
dou d,w;
}e[12];
bool cmp(node A,node B){
return A.d<B.d;
}
int main(){
cin>>d1>>c>>d2>>e[0].w>>n;
dis=c*d2;
e[0].d=0;
for(int i=1;i<=n;i++) {
cin>>e[1].d>>e[1].w;
}
e[n+1].d=d1;
sort(e,e+n+2,cmp);
for(int i=0;i<=n;i++){
if(dis<e[i+1].d-e[i].d) {
printf("No Solution");return 0;//判断是否可到达
}
}
for(int i=0;i<=n;){
dou np=e[i].w;
int pl=i;
for(int j=i+1;e[j].d-e[i].d<=dis;j++){
if(np<=e[j].w){
np=e[j].w;pl=j;
}
}
if(pl!=i){
if(nc*d2<=e[pl].d-e[i].d)
ans+=(((dou)(e[pl].d-e[i].d)/d2)-nc)*e[i].w;
nc=0.0;i=pl;
}
else{
ans+=((c-nc)*e[i].w);nc=c;
for(int j=i+1;e[j].d-e[i].d<=dis;j++){
pl=j;
}
i=pl;nc-=((dou)(e[pl].d-e[i].d)/d2);
}
// if(nc*d2<e[n+1].d-e[n].d) ans+=((dou)(e[n+1].d-e[n].d)/d2)*e[n].w;
}
if(nc*d2<e[n+1].d-e[n].d) ans+=((dou)(e[n+1].d-e[n].d)/d2)*e[n].w;
printf("%.2lf",ans);
return 0;
}