算法训练 旅行家的预算

#include<iostream>
#include<string>
using namespace std;
int main()
{
	double D1,C,D2,P;
	int N;
	cin>>D1>>C>>D2>>P>>N;
	double *value=new double[N+2]();
	double *over=new double[N+2]();
	double *way=new double[N+2]();
	value[0]=P;way[0]=0;
	double MAX=C*D2;
	bool flag=false;
	for(int i=1;i<=N;i++)
	{
		cin>>way[i]>>value[i];
		if(way[i]-way[i-1]>MAX)
		 flag=true;
	}
	if(flag)
	{
		cout<<"No Solution";
		return 0;
	}
	way[N+1]=D1;
	int i=0,j=1;
	double cost=0;
	while(i!=N+1)
	{
		double s=0;
		while((s<=MAX)&&(j<=N)&&(value[i]<=value[j]))
		{
			j++;s=s+way[j]-way[j-1];
		}
		if(s<=MAX)
		{
			if(over[i]>=way[j]-way[i])
			 over[j]=over[i]-way[j]+way[i];
			else
			{
				cost+=(way[j]-way[i]-over[i])/D2*value[i];
				over[j]=0;
			}
		}
		else
		{
			cost=cost+(MAX-over[i])/D2*value[i];
			j=i+1;
			over[j]=MAX-(way[j]-way[i]);
		}
		i=j;
	}
	printf("%.2lf",cost);
	return 0;
}

相关文章: