#include<bits/stdc++.h>
using namespace std;
inline long long read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+(ch-'0');
ch=getchar();
}
return x*f;
}
struct node{
double x,y;
}a[10001];
double ans=0;
int main()
{
double d1,c,d2,p;
int n;
scanf("%lf%lf%lf%lf",&d1,&c,&d2,&p);
n=read();
a[0].x=0;
a[0].y=p;
a[n+1].x=d1;
a[n+1].y=0;
int step1=0;
int step2=0;
for(int i=1;i<=n;i++)
{
scanf("%lf",&a[i].x);
scanf("%lf",&a[i].y);
step1=a[i].x;
a[i].x=a[i].x-step2;
step2=step1;
}
a[n+1].x=a[n+1].x-step2;
double l=0;
double cc=0;
int ii;
int minn=9999999;
int min2=0;
int ll=0;
for(int i=0;i<n+1;)
{
minn=9999999;
ii=i;
l=0;
min2=i;
for(int j=i+1;j<=n+1;j++)
{
l=l+a[j].x;
if(l>c*d2)
{
ans=ans+a[i].y*(c-cc);
cc=c;
cc=cc-ll/d2;
i=min2;
break;
}
if(a[i].y>=a[j].y)
{
ans=ans+a[i].y*max((double)0,l/d2-cc);
cc=cc+max((double)0,l/d2-cc);
cc=cc-l/d2;
i=j;
break;
}
if(minn>a[j].y)
{
minn=a[j].y;
min2=j;
ll=l;
}
}
if(ii==i)
{
cout<<"No Solution";
return 0;
}
}
printf("%.2lf",ans);
return 0;
}
整体思路和第一篇题解差不多,但是只有五十分,求大佬帮助