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\n");
62         else printf("%d\n",d[0][k]);
63     }
64     return 0;
65 }

 

转载于:https://www.cnblogs.com/huangxf/p/4412053.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值