其一:旅行家的预算

#include<cstdio>
using namespace std;
int n,len=0;
struct LLLL{
	double price;
	double sum;
}l[10];
double s,c,dis,ans=0;
double d[10],p[10];
int main(){
	scanf("%lf%lf%lf%lf%d",&s,&c,&dis,&p[0],&n);
	for(int i=1;i<=n;i++) scanf("%lf%lf",&d[i],&p[i]);
	l[0].sum=c;
    l[0].price=p[0];
    ans=c*p[0];
    len++;
    d[n+1]=s;
	for(int i=1;i<(n+2);i++){
		double lll=(d[i]-d[i-1])/dis;
		double lll1=lll;
		bool flag=1;
		while(len){
			if(l[0].sum<lll){
				len--;lll-=l[0].sum;
				for(int k=0;k<len;k++){
					l[k].price=l[k+1].price;
					l[k].sum=l[k+1].sum;
				}
			}
			else{
				l[0].sum-=lll;
				flag=0;
				break;
			}
		}
		if(flag){
			printf("No Solution");
			return 0;
		}
		flag=1;
		for(int j=0;j<len;j++){
			if(p[i]<l[j].price){
				ans-=(l[j].sum*l[j].price);
				for(int k=j+1;k<len;k++){
					l[j].sum+=l[k].sum;
					ans-=(l[k].sum*l[k].price);
				}
				l[j].sum+=lll1;
				l[j].price=p[i];
				ans+=l[j].price*l[j].sum;
				len=j+1;
				flag=0;
				break;
			}
		}
		if(flag){
			l[len].sum=lll1;
			ans+=p[i]*lll1;
			l[len].price=p[i];
			len++;
		}
	}
	printf("%.2lf",ans);
	return 0; //华丽结束
}