zoukankan      html  css  js  c++  java
  • UVA 10801 Lift Hopping Floyd

    题目链接:UVA - 10801

    题意描述:有n个电梯,给出每个电梯可以到达的楼层位置和电梯上升或下降一层楼的时间,另外在同一层楼换乘不同的电梯需要等待一分钟,问从楼层位置0(即地面)到第k层楼需要的最短时间是多少。

    算法分析:由于n很小(n<100),所有可以用Floyd算法搞之。注意换乘电梯时需要加上那60秒即可了。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cstdlib>
     5 #include<cmath>
     6 #include<algorithm>
     7 #define inf 0x7fffffff
     8 using namespace std;
     9 const int maxn=100+10;
    10 
    11 int n,k,an[maxn],d[maxn][maxn],bn[maxn];
    12 char str[3*maxn];
    13 
    14 int main()
    15 {
    16     while (scanf("%d%d",&n,&k)!=EOF)
    17     {
    18         for (int i=1 ;i<=n ;i++) scanf("%d",&an[i]);
    19         memset(str,0,sizeof(str));
    20         for (int i=0 ;i<maxn ;i++)
    21         {
    22             for (int j=0 ;j<maxn ;j++)
    23                 d[i][j]= i==j ? 0 : 99999999;
    24         }
    25         getchar();
    26         for (int i=1 ;i<=n ;i++)
    27         {
    28             gets(str);
    29             int len=strlen(str);
    30             int num=0,ok=0;
    31             int cnt=0;
    32             for (int j=0 ;j<len ;j++)
    33             {
    34                 if (str[j]==' ' && ok) {bn[cnt++]=num;num=0;ok=0;}
    35                 else
    36                 {
    37                     num=num*10+str[j]-'0';
    38                     ok=1;
    39                 }
    40                 if (j==len-1 && ok) bn[cnt++]=num;
    41             }
    42             for (int j=0 ;j<cnt ;j++)
    43             {
    44                 for (int u=j+1 ;u<cnt ;u++)
    45                 {
    46                     if (d[bn[j] ][bn[u] ]>an[i]*(bn[u]-bn[j])) {
    47                         d[bn[j] ][bn[u] ]=d[bn[u] ][bn[j] ]=an[i]*(bn[u]-bn[j]);
    48                     }
    49 
    50                 }
    51             }
    52         }
    53         for (int i=0 ;i<maxn ;i++)
    54         {
    55             for (int j=0 ;j<maxn ;j++) if (i!=j)
    56             {
    57                 for (int u=0 ;u<maxn ;u++) if (i!=u && j!=u)
    58                     d[j][u]=min(d[j][u],d[j][i]+d[i][u]+60);
    59             }
    60         }
    61         if (d[0][k]==99999999) printf("IMPOSSIBLE
    ");
    62         else printf("%d
    ",d[0][k]);
    63     }
    64     return 0;
    65 }
  • 相关阅读:
    yum提示another app is currently holding the yum lock;waiting for it to exit
    关于CentOS下 yum包下载下的rpm包放置路径
    Linux查看History记录加时间戳小技巧
    swift能干什么,不能干什么及相关概念
    yum改成网易的源
    dd测试硬盘性能
    对象存储
    IDEA的常用快捷键
    httpFS访问
    关于hadoop: command not found的问题
  • 原文地址:https://www.cnblogs.com/huangxf/p/4412053.html
Copyright © 2011-2022 走看看