题目背景

开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道、一辆停在轨道底部的电梯、和电梯内一杆控制电梯升降的巨大手柄。

题目描述

Nescafe 之塔一共有N 层,升降梯在每层都有一个停靠点。手柄有M个控制槽,第i 个控制槽旁边标着一个数Ci,满足C1<C2<C3<⋯⋯<CM。如果Ci>0,表示手柄扳动到该槽时,电梯将上升Ci 层;如果Ci<0,表示手柄扳动到该槽时,电梯将下降-Ci 层;并且一定存在一个Ci=0,手柄最初就位于此槽中。注意升降梯只能在1到N 层间移动,因此扳动到使升降梯移动到1 层以下、N 层以上的控制槽是不允许的。

电梯每移动一层,需要花费2 秒钟时间,而手柄从一个控制槽扳到相邻的槽,需要花费1 秒钟时间。探险队员现在在1 层,并且想尽快到达N 层,他们想知道从1 层到N 层至少需要多长时间?

输入输出格式

输入格式:

第一行两个正整数 N、M。

第二行M 个整数C1、C2⋯⋯CM。

输出格式:

输出一个整数表示答案,即至少需要多长时间。若不可能到达输出-1。

输入输出样例

输入样例#1:

6 3
-1 0 2

输出样例#1:

19

说明

对于30% 的数据,满足1≤N≤ 10; 2≤M≤ 5。

对于100% 的数据,满足1≤N≤1000; 2 ≤ M ≤20;-N < C1 <C2 < …… < CM < N。

样例解释

手柄从第二个槽扳到第三个槽(0 扳到2),用时1 秒,电梯上升到3层,用时4 秒。

手柄在第三个槽不动,电梯再上升到5 层,用时4 秒。

手柄扳动到第一个槽(2 扳到-1),用时2 秒,电梯下降到4 层,用时2 秒。

手柄扳动到第三个槽(-1 扳倒2),用时2 秒,电梯上升到6 层,用时4 秒。

总用时为(1+4)+4+(2+2)+(2+4)=19 秒。

这套题考的是图论专题,欧教说这题是spfa。。。。对于这个我有点懵????

SPFA????????

好吧说实话我并没有看出来,也不知道怎么去建边建点。。我是用dp做的这道题

事后同学也说是spfa。。。我。。。。

好吧我是萌新我不知道大佬们的spfa是咋做的

我来讲我的dp做法吧

dp[i][j]表示在第i层的时候在第j槽。。。。

这个应该不能理解,这个定义同时也可以理解成,在i层的时候,上一次停留是在i-a[j]层

然后我们在转移状态的时候只需要枚举一下在第i-a[j]层的时候的手柄停留在哪个槽,比如枚举是在第k个槽

那么在从i-a[j]层到i层需要花费的时间是abs(k-j)+abs(a[j])*2

ok这样就可以得出状态转移方程式了

dp[i][j]=min(  dp[i][j]  ,  { dp[ i -a[j] ][ k ] + abs( k - j ) + abs ( a[j] ) * 2 }(1<=k<=m) )

做到这里,大体就完成了。。。但是不知道有没有注意到一个细节,就是i到底应该从n到1循环还是从1到n循环。。。。

好吧这个不是大问题,关键在于这个上升楼层有负数,即可以下降。。。。意思是无论我们从n到1还是1到n都不能转移完所有状态

所有这里可以check一下,如果在dp后数组的值有变化就再来一次,直到数组的值不会变化了。。。这里可以用while实现

 1 #include<cstdio>
 2 #include<queue>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<cstdlib>
 8 #define maxn 1005
 9 #define maxm 22
10 using namespace std;
11
12 int n,m,a[maxm],s,ans=0x3f3f3f,f[maxn][maxm];
13 int cando=1,val[maxn][maxm];
14
15 void change()
16 {
17     for(int i=1;i<=n;i++)
18      for(int j=1;j<=m;j++)
19       val[i][j]=f[i][j];
20 }
21
22 void check()
23 {
24     for(int i=1;i<=n;i++)
25      for(int j=1;j<=m;j++)
26      {
27          if(val[i][j]!=f[i][j]){
28              cando=1;return;//有变动
29          }
30      }
31     cando=0;//无变动
32 }
33
34 int main()
35 {
36     memset(f,0x3f3f3f,sizeof(f));
37     scanf("%d%d",&n,&m);
38     for(int i=1;i<=m;i++){
39         scanf("%d",&a[i]);if(a[i]==0)s=i;
40     }
41     f[1][s]=0;
42     for(int i=1;i<=m;i++){if(i!=s)f[1][i]=abs(s-i);}
43
44     while(cando==1){
45         change();
46         for(int i=n;i>=1;i--)
47         {
48             for(int j=1;j<=m;j++)
49             {
50                 if(j!=s){
51                     int ncnt=i-a[j];
52                     if(ncnt<1||ncnt>n)continue;
53                     for(int k=1;k<=m;k++){
54                         if(k!=s){
55                             int ntim=abs(k-j)+abs(a[j])*2;
56                             f[i][j]=min(f[i][j],ntim+f[ncnt][k]);
57                         }
58                     }
59                 }
60                 if(i==n)ans=min(ans,f[n][j]);
61             }
62         }
63         check();
64     }
65
66     if(ans==0x3f3f3f)printf("-1");
67     else printf("%d",ans);
68 }

View Code

转载于:https://www.cnblogs.com/Danzel-Aria233/p/7619745.html

[tyvj2032]升降梯上dpspfa相关推荐

  1. tyvj2032 升降梯上

    述 开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道.一辆停在轨道底部的电梯.和电梯内一杆控制电梯升降的巨大手柄. Nescafe之塔一共有N层,升降 ...

  2. TYVJ2032 「Poetize9」升降梯上

    P2032 「Poetize9」升降梯上 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道, ...

  3. BSOJ3806 TYVJ 2032 升降梯上

    3806 -- [模拟试题]升降梯上 Description 开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道.一辆停在轨道底部的电梯.和电梯内一杆控 ...

  4. 《算法竞赛指南》0x6B 升降梯上

    升降梯上 大意 n层塔,m个按钮,每次拉拉杆上下电梯,拉拉杆需1s,上下一层需2s,求最小的上升到顶层的时间 思路 虽然看起来不像,但我们可以用最短路中的分层图来思考,遍历每个点以及每个拉杆所上下的楼 ...

  5. 「Poetize9」升降梯上(tyvj2032)(最短路)

    开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道.一辆停在轨道底部的电梯.和电梯内一杆控制电梯升降的巨大手柄. Nescafe之塔一共有N层,升降梯在 ...

  6. 【最短路算法例题-升降梯上】-C++

    描述 启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道.一辆停在轨道底部的电梯.和电梯内一杆控制电梯升降的巨大手柄. Nescafe之塔一共有N层,升降 ...

  7. 《算法竞赛进阶指南》0x6B T2 升降梯上

    题目传送门 题目描述 开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道.一辆停在轨道底部的电梯.和电梯内一杆控制电梯升降的巨大手柄. Nescafé ...

  8. 【图论】C_算竞_升降梯上(二维抽象一维)

    一.题目描述 开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道.一辆停在轨道底部的电梯.和电梯内一杆控制电梯升降的巨大手柄. Nescafé 之塔一共 ...

  9. TYVJ P2032 「Poetize9」升降梯上 spfa最短路

    %%%暴搜出奇迹%%%@SiriusRen 其实我刚开始题读错了,才导致我写图论... spfa跑最短路,开一个node记录状态(pair当然滋磁):所在楼层和槽的位置 以层数为1,槽在0的位置 为初 ...

  10. 欺骗的艺术——第二部分(9)

    第十章 进入内部(1) 为什么一个外部人员伪装成一个公司员工会这样容易?为什么他们的扮演会如此有说服力甚 至有高度安全意识的人都会受骗?为什么欺骗十分了解安全程序(怀疑不是他们亲自认识的 人并保护他们 ...

最新文章

  1. chrome动态ip python_简单python代码实现模拟浏览器操作
  2. matlab控工大作业,哈工大现代控制理论matlab极点配置作业
  3. PyTorch-模型可视化工具TorchSummary
  4. 机器学习--机器学习的分类
  5. ie9 css过大,CSS 3后台大小不适用于IE9(CSS 3 background-size not working on IE9)
  6. 自制操作系统-使用汇编显示 hello world
  7. Atitit.struts排除url 的设计and 原理 自定义filter 排除特定url
  8. python数据分析学什么意思_什么是python数据分析
  9. 修改word默认模板(Normal.dotm)
  10. word在另外计算机格式不对,为什么同一个word文档在两台电脑上打开里面的格式不一样...
  11. GTK开发(二)控件和布局
  12. 网站使用CDN加速的5个优势
  13. a++和++a的区别
  14. POI生成word文档,包括标题,段落,表格,统计图(非图片格式)
  15. 多线程的40个面试题总结(上)
  16. 最全的ORACLE-SQL笔记(转,出处不详)
  17. 12.看板方法——度量和管理报告笔记
  18. Brt课程设计day3
  19. NSX-T 系列:第 6 部分 - 准备配置文件
  20. mysql中discount用法_MySQL 技巧:COALESCE 函数的使用

热门文章

  1. Django模板中加减乘除基本语法
  2. 探险家开发者 Niek Bokkers 的故事 | #IMakeApps
  3. win7字体安装_PR CC 下载和安装教程
  4. 清明上河图30亿像素_清明上河图全图下载
  5. 嵌入式 Linux 入门 环境篇(四、必备开发工具安装)
  6. itext 生成 PDF
  7. Java利用itext实现导出PDF文件
  8. php复姓怎么排序,按姓氏笔画排名怎么排列了
  9. 集成极光推送和厂商通道相关总结
  10. 小米笔记本air13-3安装黑苹果macOS