#include<bits/stdc++.h>
using namespace std;
struct stata{
double Pi,Di;
}a[200];
int cmp(stata &x,stata &y){
return x.Di<y.Di;
}
double D1,C,D2,P;int N;
int flag=0;
int Check(int S,int E,double Num){
int retr=0,Smal;
int Minn=-1000;
for(int k=S;k<=E;k++){
if(Minn<=a[k].Pi){
Minn=a[k].Pi;
Smal=k;
}
if(a[k].Pi<=Num)
return k;
}
if(!retr){
flag=1;//真
return Smal;
}
}
void Find(int Place,double Rest,double Money){
if(a[Place].Di+C*D2<a[Place+1].Di){
printf("No Solution");
return;
}
if(Place==N+1){
printf("%.2lf",Money);
return;
}
int i=Place+1;
double cand=a[Place].Di+D2*C;
int Cnt=0,j;
for(j=i;;){
if(a[j].Di<=cand){
j++;
Cnt++;
}
else break;
}
int King=Check(i,i+Cnt,a[Place].Pi);
if(!flag){
Money+=(((a[King].Di-a[Place].Di)/D2-Rest)*a[Place].Pi);
Find(King,0,Money);
}
else {
Money+=((C-Rest)*a[Place].Pi);
Find(King,C,Money);
}
return;
}
int main(){
//freopen("P1016_1 (1).in","r",stdin);
//freopen("P1016_1.out","w",stdout);
scanf("%lf%lf%lf%lf%d",&D1,&C,&D2,&P,&N);
for(int i=1;i<=N;i++){
scanf("%lf%lf",&a[i].Di,&a[i].Pi);
}
sort(a+1,a+N+1,cmp);
a[N+1].Di=D1;
a[0].Pi=P;
a[N+1].Pi=-1000;
a[0].Di=0;
Find(0,0,0);
return 0;
}
样例过了,下载数据也和答案一样;为什么会RE??