- 题目描述:
- 在某条线路上有N个火车站,有三种距离的路程,L1,L2,L3,对应的价格为C1,C2,C3.其对应关系如下:
距离s 票价
0<S<=L1 C1
L1<S<=L2 C2
L2<S<=L3 C3
输入保证0<L1<L2<L3<10^9,0<C1<C2<C3<10^9。
每两个站之间的距离不超过L3。
当乘客要移动的两个站的距离大于L3的时候,可以选择从中间一个站下车,然后买票再上车,所以乘客整个过程中至少会买两张票。
现在给你一个 L1,L2,L3,C1,C2,C3。然后是A B的值,其分别为乘客旅程的起始站和终点站。
然后输入N,N为该线路上的总的火车站数目,然后输入N-1个整数,分别代表从该线路上的第一个站,到第2个站,第3个站,……,第N个站的距离。
根据输入,输出乘客从A到B站的最小花费。
- 输入:
-
以如下格式输入数据:
L1 L2 L3 C1 C2 C3
A B
N
a[2]
a[3]
……
a[N]
- 输出:
-
可能有多组测试数据,对于每一组数据,
根据输入,输出乘客从A到B站的最小花费。
- 样例输入:
-
1 2 3 1 2 3
1 2
2
2
- 样例输出:
-
2
#include<iostream>
#include<algorithm>
#include<cmath>
#define MAXN 10000
#define INF 0xFFFFFFFFFF
long long L1,L2,L3,C1,C2,C3;
long long cost(long long l1,long long l2)
{
if(abs(l1-l2)<=L1)
return C1;
else if(abs(l1-l2)<=L2)
return C2;
return C3;
}
long long min(long long a,long long b){
return a<b ? a : b ;
}
int main()
{
long long i,j,k,dp[MAXN];
long long start,end,N,L[MAXN];
while(cin>>L1>>L2>>L3>>C1>>C2>>C3)
{
cin>>start>>end;
cin>>N;
for(i=2;i<=N;i++)
cin<<L[i];
L[1]=0;
for(i=0;i<=MAXN;i++)
dp[i]=INF;
dp[start]=0;
for(i=start;i<=end;i++)
{
for(j=i+1;j<=end&&(L[j]-L[i])<=L3;j++)
dp[j]=min(dp[j],dp[i]+cost(L[i],L[j]));
}
cout<<dp[end]<<endl;
}
return 0;
}