九度oj 1086

题目描述:
在某条线路上有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
来源:

2011年清华大学计算机研究生机试真题

#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;
                                                                                                                                }
                                                                                                                                }
                                                     


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值