九度oj 1086

来源:互联网 发布:apache tomcat 6下载 编辑:程序博客网 时间:2024/06/06 17:36
题目描述:
在某条线路上有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 31 222
样例输出:
2
来源:

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

#include<iostream>#include<stdio.h>#define inf  9999999999using 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;                                                                                                                                }                                                                                                                                }                                                     


0 0
原创粉丝点击