这个题目就是说两站间通过相应距离可以买相应的票,问你从某站到某站最小费用
dp,要知道买票的时候肯定是越接近最大距离越划算,后面的站的最小价格是由前面那些站的最小价决定的
所以、、、、、、
View Code
#include <stdio.h>
#define inf 1<<30
int L[3];
int C[3];
int n,s,t;
int a[10003];
int dp[10003];
int x,y,z;
inline int min(int p,int q)
{
return p<q?p:q;
}
int main()
{
int temp;
int i;
while(scanf("%d%d%d%d%d%d",&L[0],&L[1],&L[2],&C[0],&C[1],&C[2])!=EOF)
{
scanf("%d",&n);
scanf("%d%d",&s,&t);
if(s>t)
{
temp=s;
s=t;
t=temp;
}
a[1]=0;
for(i=2;i<=n;i++)
{
scanf("%d",&a[i]);
}
dp[s]=0;
x=s,y=s,z=s;
for(i=s+1;i<=t;i++)
{
dp[i]=inf;
//因为C0,C1,C2是递增的,所以不用担心买到不属于自己区间的票,肯定会选便宜的票
//要知道便宜的票都是合法的。
//复杂度o(3n)
while((a[i]-a[x])>L[0]) x++; //找出相距不大于L里面最近的点
while((a[i]-a[y])>L[1]) y++;
while((a[i]-a[z])>L[2]) z++;
dp[i]=min(dp[i],dp[x]+C[0]);
dp[i]=min(dp[i],dp[y]+C[1]);
dp[i]=min(dp[i],dp[z]+C[2]);
}
printf("%d\n",dp[t]);
}
return 0;
}

浙公网安备 33010602011771号