-
题目描述:
-
在某条线路上有N个火车站,有三种距离的路程,L1,L2,L3,对应的价格为C1,C2,C3.其对应关系如下:距离s 票价0<S<=L1 C1L1<S<=L2 C2L2<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 C3A BNa[2]a[3]……a[N]
-
输出:
-
可能有多组测试数据,对于每一组数据,根据输入,输出乘客从A到B站的最小花费。
-
样例输入:
-
1 2 3 1 2 3 1 2 2 2
-
样例输出:
-
2
-
来源:
#include<iostream>
#include<stdio.h>
#define inf 9999999999
using namespace std;
long long int l1,l2,l3,c1,c2,c3;
long long int a,b,n;
long long int route[200][200];
long long int cost(long long int l)
{
if(l>=0&&l<=l1)
{
return c1;
}
else if(l<=l2)
{
return c2;
}
else if(l<=l3)
{
return c3;
}
else if(l>l3)
{
return inf;
}
}
int main()
{
while(cin>>l1>>l2>>l3>>c1>>c2>>c3)
{
cin>>a>>b;
if(a==b)
{
cout<<"0"<<endl;
continue;
}
long long int dis[1000];
int n;
cin>>n;
dis[1]=0;
for(int i=2;i<=n;i++)
{
cin>>dis[i];
}
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
if(i==j)
{
route[i][j]=0;
}
else
{
route[i][j] = route[j][i] = cost(dis[j]-dis[i]);}
}
}
long long longs[1000];
int mark[1000];
for(int i=1;i<=n;i++)
{
longs[i]=route[a][i];
mark[i]=0;
}
mark[a]=1;
int newp=a;
for(int j=1;j<n;j++)
{
for(int i=1;i<=n;i++)
{
if(route[newp][i]==inf)
{
continue;
}
if(mark[i]==1)
{
continue;
}
if(longs[i]>longs[newp]+route[newp][i])
{
longs[i]=longs[newp]+route[newp][i];
}
}
long long min=inf;
for(int i=1;i<=n;i++)
{
if(mark[i]==0&&longs[i]<min)
{
min=longs[i];
newp=i;
}
}
mark[newp]=1;
}
cout<<longs[b]<<endl;
}
}