题目传送门

题目描述

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

Nescafé 之塔一共有 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≤N≤1000,1≤N≤1000,1≤N≤1000,
2≤M≤20,2≤M≤20,2≤M≤20,
−N<C1<C2<…<CM<N−N<C_1<C_2<…<C_M<N−N<C1​<C2​<…<CM​<N

输入样例:

6 3
-1 0 2

输出样例:

19

题解

这是一道比较简单的分层图题,我们来考虑如何建图
以每个开关为一层,建立分层图
在同一层图上,应该以这层对应的开关能够移动的距离为媒介,将这一层中的iii号点与i+ci+ci+c号点连接起来,路程为∣c∣∗2|c|*2∣c∣∗2,注意i+ci+ci+c要在1−n1-n1−n范围之内,否则等同于飞出电梯,不符合题意
层与层之间,我们在任意一楼都可能改变开关位置,移动到其他的层上,所以我们需要在每一个位置都建立从这一层到其他任意一层的路径,路程为abs(i−j)abs(i-j)abs(i−j)
然后就可以顺利的跑最短路啦

code
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
const int M=1e6;
int n,m;
int ys(int x,int y)
{return x*n+y;
}
struct Star
{int nxt,val,to;
}edge[2*M];
int head[N*20],tot=0;
void Lian(int x,int y,int z)
{tot++;edge[tot].val=z;edge[tot].to=y;edge[tot].nxt=head[x];head[x]=tot;
}
struct node
{int d,p;bool operator<(const node &x)const{return d>x.d;}
};
int b,dis[N*20],vis[N*20];
void dijkstra()
{int ts=ys(b,1);priority_queue<node> q;memset(dis,0x3f,sizeof(dis));dis[ts]=0;node a;a.d=0;a.p=ts;q.push(a);while(!q.empty()){a=q.top();q.pop();int x=a.p;if(vis[x]) continue;vis[x]=1;for(int i=head[x];i;i=edge[i].nxt){int y=edge[i].to;if(dis[y]>dis[x]+edge[i].val){dis[y]=dis[x]+edge[i].val;a.d=dis[y];a.p=y;q.push(a);}}}
}
int main()
{cin>>n>>m;for(int i=0;i<m;i++){int c;cin>>c;if(c==0) b=i;for(int j=1;j<=n;j++)if(j+c<=n&&j+c>=1) Lian(ys(i,j),ys(i,j+c),2*abs(c));}for(int i=0;i<m;i++)for(int j=0;j<m;j++){if(i==j) continue;for(int k=1;k<=n;k++)Lian(ys(i,k),ys(j,k),abs(i-j));}dijkstra(); int ans=0x3f3f3f3f;for(int i=0;i<m;i++) {ans=min(ans,dis[ys(i,n)]);}if(ans==0x3f3f3f3f) cout<<-1;else cout<<ans;return 0;
}

《算法竞赛进阶指南》0x6B T2 升降梯上相关推荐

  1. 《算法竞赛进阶指南》打卡-基本算法-AcWing 93. 递归实现组合型枚举:递归与递推、dfs、状态压缩

    文章目录 题目解答 题目链接 题目解答 分析: 此题和笔者另一篇博文很像,只不过是限定了个数.<算法竞赛进阶指南>打卡-基本算法-AcWing 92. 递归实现指数型枚举:递推与递归.二进 ...

  2. 《算法竞赛进阶指南(by 李煜东)》习题题解 集合

    又是笔者给自己挖的大坑. 这里是李煜东所著<算法竞赛进阶指南(by 李煜东)>的习题题解集合. 有任何错误请在对应文章下反馈或联系 nicest1919@163.com ,谢谢 qwq 从 ...

  3. 中位数--《算法竞赛进阶指南》(货仓选址和七夕祭问题详解)

    中位数 今天又和大家见面了啦~ 依旧是 <算法竞赛进阶指南>的学习哦~ 中位数(Median)又称中值,统计学中的专有名词,是按顺序排列的一组数据中居于中间位置的数,代表一个样本.种群或概 ...

  4. AcWing 122. 糖果传递【贪心】【《算法竞赛进阶指南》,微软面试题 , HAOI2008】

    AcWing 122. 糖果传递 一.题目链接 二.题目分析 (一)算法标签 (二)解题思路 三.AC代码 四.其它题解 一.题目链接 AcWing 122. 糖果传递 进阶题目 AcWing 105 ...

  5. 算法竞赛进阶指南 萌新入门!

    算法竞赛进阶指南 文章目录 算法竞赛进阶指南 前言 一.介绍本书 二.如何阅读本书 三.总结 **笔记思路和结构 ** 算法竞赛进阶指南 这篇文章就简单的写一下吧! 前言 ​ 作为一个想要入坑的算法的 ...

  6. 《算法竞赛进阶指南》数论篇

    <算法竞赛进阶指南>数论篇(1)-最大公约数,素数筛,欧拉函数,同余,欧拉定理,BSGS <算法竞赛进阶指南>数论篇(1)-最大公约数,素数筛,欧拉函数,同余,欧拉定理,BSG ...

  7. CH5202 自然数拆分Lunatic版(算法竞赛进阶指南,完全背包)

    算法竞赛进阶指南,278页,完全背包 本题要点: 1.把完全背包的代码改改即可.常规的完全背包: 有n个物品,每个物品的体积是v[i], 价值是w[i], 求装到大小为m的大背包,能获得的最大价值(每 ...

  8. 金字塔(算法竞赛进阶指南)

    虽然探索金字塔是极其老套的剧情,但是有一队探险家还是到了某金字塔脚下. 经过多年的研究,科学家对这座金字塔的内部结构已经有所了解. 首先,金字塔由若干房间组成,房间之间连有通道. 如果把房间看作节点, ...

  9. 算法竞赛进阶指南 骑士放置

    4: 最大独立集 :选出最多的点,使得选出的点之间没有边. 求最大独立集:选出最小的点可以破坏所有的边 <==>最小点覆盖 <==>最大匹配数. 假设最大匹配数为m,共有n个点 ...

  10. 算法竞赛进阶指南0x3A 博弈论之SG函数

    算法竞赛进阶指南0x3A 博弈论之SG函数

最新文章

  1. Android常用URI收藏
  2. [产品设计]为什么目前的运动手表的产品设计是错的?
  3. jna 不是有效的 win32 应用程序_教你打开程序提示不是有效的win32程序怎么办
  4. PHP通过CURL或file_get_contents请求第三方地址
  5. OWASP依赖性检查Maven插件–必须具备
  6. [转贴]非技术:在广州天河北被抢全记录(入面D广州话真系厉害,不懂粤语者别看,会吐血)...
  7. 第2章_Java基本语法(下):程序流程控制
  8. python测开课程_2020年第五期《python接口自动化+测试开发》课程,10月11号开学(火热报名中!)...
  9. plt.rcParams[‘font.sans-serif‘] = [‘SimHei‘] 和plt.rcParams[‘axes.unicode_minus‘] = False
  10. 浏览器保存图片时,将jfif改为jpg格式
  11. 晓日程-首款打通微信和桌面的免费日历应用
  12. 使用ID3算法实现决策树
  13. CRM上线之路 走上了CRM实施顾问-第100天上班 -第21周
  14. APP游戏开发十诫!第一个雏型就要搞定的事
  15. 基于51单片机的简易雷达定位装置
  16. spring配置详解
  17. 创建一个图文并茂的调查
  18. 如何删掉“分节符(下一页)
  19. osmdroid 在线加载谷歌瓦片(谷歌地图瓦片地址解释)
  20. OpenWRT学习笔记-45 mt76x2e闭源驱动移植(上)

热门文章

  1. 如何理解IGBT的热阻和热阻抗?
  2. “鬼影”病毒作者改邪归正? 避风头停止开发病毒
  3. vs2010的程序在win2000上运行
  4. 人工智能与机器学习技术在医疗保健行业中的应用
  5. Xamarin.Android 微信登录回调没有反应问题的解决办法
  6. python面向对象-三大特性
  7. 为什么海归金融就业这么难?
  8. 李想两万字回应:我们如何造车?
  9. ubuntu16.04+惠普光影精灵+GTX960M+英伟达驱动安装
  10. utf8转gb2312精简版