您的位置:首页 > 其它

【codevs1349】 (板猪的)火车票 解题报告

2015-08-24 11:01 351 查看
板猪的火车票  codevs1349黄金Gold

题目描述 Description

奸商zn(请勿对号入座)开办了一家火车公司,弱弱的板猪要去看望她的朋友小板猪,万恶的zn对板猪实施各种提高价,板猪不寒而栗。。。
铁路线上有n(2<=n<=10000)个火车站,每个火车站到该线路的首发火车站距离都是已知的。任意两站之间的票价如下表所示:
站之间的距离 - X      票价
0<X<=L1       C1
L1<X<=L2          C2
L2<X<=L3          C3
其中L1,L2,L3,C1,C2,C3都是已知的正整数,且(1 <= L1 < L2 < L3 <= 10^9, 1 <= C1 < C2 < C3 <= 10^9)。显然若两站之间的距离大于L3,那么从一站到另一站至少要买两张票。注意:每一张票在使用时只能从一站开始到另一站结束。
现在板猪要从A到B,为了不让奸商zn敲竹杠,你能帮助板猪吗?

输入描述 Input Description

输入文件的第一行为6个整数, L1, L2, L3, C1, C2, C3 (1 <= L1 < L2 < L3 <= 10^9, 1 <= C1 < C2 < C3 <= 10^9) ,这些整数由空格隔开.第二行为火车站的数量N (2 <= N <= 10000).第三行为两个不同的整数A、B,由空格隔开。接下来的 N-1 行包含从第一站到其他站之间的距离.这些距离按照增长的顺序被设置为不同的正整数。相邻两站之间的距离不超过L3. 两个给定火车站之间行程花费的最小值不超过10^9,而且任意两站之间距离不超过 10^9。

输出描述 Output Description

   输出文件中只有一个数字,表示从A到B要花费的最小值.

样例输入 Sample Input

3 6 8 20 30 40
7
2 6
3
7
8
13
15
23

样例输出 Sample Output

70

【解题思路】

其实这就是一个水水的动归,,不过刚开始我困住了。。后来才知道原来动归还可以这么写。。。

f[i]表示从起点到i的最少花费,所以目标值是f[t];

就是一个最简单的动归,,,我只不过是被迷惑了双眼。。。不过我动归的渣渣我承认。。。

【代码】

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int l1,l2,l3,c1,c2,c3,n,s,t,c,i,j;
int a[5005];
long long f[5005];

int main()
{
scanf("%d%d%d%d%d%d",&l1,&l2,&l3,&c1,&c2,&c3);
scanf("%d",&n);
scanf("%d%d",&s,&t);
if (s>t)
{
c=s;
s=t;
t=c;
}
if (s==t)
{
printf("0");
return 0;
}
a[1]=0;
for (i=2;i<=n;++i)
scanf("%d",&a[i]);
memset(f,127,sizeof(f));
f[s]=0;
for (i=s+1; i<=t; ++i)
for (j=s; j<=t-1; ++j)
{
if (a[i]-a[j]<=l1)
if (f[j]+c1<f[i])
f[i]=f[j]+c1;
if (a[i]-a[j]>l1&&a[i]-a[j]<=l2)
if (f[j]+c2<f[i])
f[i]=f[j]+c2;
if (a[i]-a[j]>l2&&a[i]-a[j]<=l3)
if (f[j]+c3<f[i])
f[i]=f[j]+c3;
}
cout<<f[t];
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: