TYVJ2032 「Poetize9」升降梯上

P2032 「Poetize9」升降梯上

时间: 1000ms / 空间: 131072KiB / Java类名: Main

描述

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

输出

19

备注

手柄从第二个槽扳到第三个槽(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秒。

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

【题解】

(i - 1) * m + j - 1表示在第i层j槽处

连边Dijstra即可

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <vector>
  4 #include <cstdlib>
  5 #include <cstring>
  6 #include <queue>
  7 #define max(a, b) ((a) > (b) ? (a) : (b))
  8 #define min(a, b) ((a) < (b) ? (a) : (b))
  9 #define abs(a) ((a) < 0 ? (-1 * (a)) : (a))
 10
 11 const int INF = 0x3f3f3f3f;
 12 const int MAXN = 1000 + 10;
 13 const int MAXM = 20 + 5;
 14
 15 inline void read(int &x)
 16 {
 17     x = 0;char ch = getchar(), c = ch;
 18     while(ch < ‘0‘ || ch > ‘9‘) c = ch, ch = getchar();
 19     while(ch <= ‘9‘ && ch >= ‘0‘) x = x * 10 + ch - ‘0‘, ch = getchar();
 20     if(c == ‘-‘)x = -x;
 21 }
 22
 23 int n,m;
 24
 25 inline int number(int a, int b)
 26 {
 27     return (a - 1) * m + b - 1;
 28 }
 29
 30 struct Edge
 31 {
 32     int u,v,w,next;
 33     Edge(int _u, int _v, int _w, int _next){u = _u;v = _v;w = _w;next = _next;}
 34     Edge(){}
 35 }edge[MAXN * MAXM * MAXM * 4];
 36 int head[MAXN * MAXM * 2], cnt, c[MAXN];
 37
 38 inline void insert(int a, int b, int c)
 39 {
 40     edge[++cnt] = Edge(a,b,c,head[a]);
 41     head[a] = cnt;
 42 }
 43
 44 struct Node
 45 {
 46     int node,w;
 47     Node(int a, int b){node = a;w = b;}
 48     Node(){}
 49 };
 50
 51 struct cmp
 52 {
 53     bool operator()(Node a, Node b)
 54     {
 55         return a.w > b.w;
 56     }
 57 };
 58
 59 std::priority_queue<Node, std::vector<Node>, cmp> q;
 60 int s, d[MAXN * MAXM * 2], b[MAXN * MAXM * 2];
 61
 62 void dijstra()
 63 {
 64     memset(d, 0x3f, sizeof(d));
 65     d[s] = 0;
 66     q.push(Node(s, 0));
 67     Node tmp;
 68     int u,v;
 69     while(q.size())
 70     {
 71         tmp = q.top(), q.pop();
 72         if(b[tmp.node])continue;
 73         u = tmp.node;
 74         b[u] = 1;
 75         for(register int pos = head[u];pos;pos = edge[pos].next)
 76         {
 77             v = edge[pos].v;
 78             if(b[v])continue;
 79             if(d[v] > d[u] + edge[pos].w)
 80             {
 81                 d[v] = d[u] + edge[pos].w;
 82                 q.push(Node(v, d[v]));
 83             }
 84         }
 85     }
 86 }
 87
 88 int main()
 89 {
 90     read(n), read(m);
 91     for(register int i = 1;i <= m;++ i)
 92     {
 93         read(c[i]);
 94         if(c[i] == 0)s = number(1, i);
 95     }
 96     for(register int i = 1;i < n;++ i)
 97     {
 98         for(int j = 1;j <= m;++ j)
 99         {
100             if(i + c[j] > 0 && i + c[j] <= n && c[j] != 0)
101                 insert(number(i,j), number(i + c[j], j), abs(c[j]) * 2);
102             for(int k = 1;k <= m;++ k)
103                 if(k != j)
104                     insert(number(i, j), number(i, k), abs(j - k));
105         }
106     }
107     dijstra();
108     int ans = INF;
109     for(register int i = 1;i <= m;++ i)
110         ans = min(ans, d[number(n, i)]);
111     if(ans == INF)ans = -1;
112     printf("%d", ans);
113     return 0;
114 }

TYVJ2032

时间: 2024-11-10 12:09:56

TYVJ2032 「Poetize9」升降梯上的相关文章

P2032 「Poetize9」升降梯上

描述 开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道.一辆停在轨道底部的电梯.和电梯内一杆控制电梯升降的巨大手柄.Nescafe之塔一共有N层,升降梯在每层都有一个停靠点.手柄有M个控制槽,第i个控制槽旁边标着一个数Ci,满足C1<C2<C3<……<CM.如果Ci>0,表示手柄扳动到该槽时,电梯将上升Ci层:如果Ci<0,表示手柄扳动到该槽时,电梯将下降-Ci层:并且一定存在一个Ci=0,手柄最初就位于此槽中.注意升降

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

%%%暴搜出奇迹%%%@SiriusRen 其实我刚开始题读错了,才导致我写图论... spfa跑最短路,开一个node记录状态(pair当然滋磁):所在楼层和槽的位置 以层数为1,槽在0的位置 为初始状态并进队,向每一个合法位置扩展,跑spfa,直到收敛. #include<cstdio> #include<iostream> #include<queue> #include<cstring> #include<cmath> #define R

P2031 「Poetize9」升降梯口

3056: 升降梯口 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 43  Solved: 42[Submit][Status] Description 一 些探险家组队去探索神秘的Nescafe之塔.经过一番周折,探险队员们终于突破了塔门,来到了Nescafe之塔的一层大殿.而探险队员们想要拜访的四 大护法和塔之圣主据传都住在塔的高层,因此他们迅速奔向了大殿一侧的升降梯口.不过由于Nescafe之塔乃是一年一度封印和开启“Nescafe之杯” 的

「Poetize9」礼物运送

3055: 礼物运送 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 18  Solved: 12[Submit][Status] Description 机器人刚刚探查归来,探险队员们突然发现自己的脚下出现了一朵朵白云,把他们托向了空中.一阵飘飘然的感觉过后,队员们发现自己被传送到了一座空中花园. “远道而来的客人,我们是守护Nescafe之塔的精灵.如果你们想拜访护法和圣主的话,就要由我们引路.因此,你们是不是该给我们一点礼物呢T_T?” 队员们

Linux 小知识翻译 - 「Linux」和病毒

据说,「Linux」系统上的病毒要远远少于Windows系统上病毒.从2种系统的普及度来看,这是很显然的, 「Linux」的使用人群很少,所以「Linux」上的病毒的扩散时,受害的范围也不大. 但是,认为「Linux上不存在病毒」,「Linux不需要病毒防范策略」等等都是不对的. Linux感染病毒的情况也是有的,不仅如此,在Linux服务器上情况更为显著,比如一个windows平台的病毒混入了Linux服务器中, 其他连接此Linux服务器的Windows系统也有可能会感染这个病毒的. 使用L

从 Spring Cloud 看一个微服务框架的「五脏六腑」

原文:https://webfe.kujiale.com/spring-could-heart/ Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构所需的各种组件. 注:Spring Boot 简单理解就是简化 Spring 项目的搭建.配置.组合的框架.因为与构建微服务本身没有直接关系,所以本文不对 Spring Boot 进行展开.另外本文有一些例子涉及到 Spring 和 Spring Boot,建议先了解一下 Spring 和 Spri

上「知乎」,与 SAP 一同探索「独角兽」成长的甜蜜与烦恼

独角兽企业,一般指创办时间相对较短.估值超过10亿美元的创业企业.如今,全球独角兽公司榜单上的中国面孔越来越多.2017年,全球十大独角兽企业中,将近一半来自中国. 这些如同「开挂」一般迅速成长的企业,虽然饱受众多媒体与用户的青睐,更是资本市场的宠儿,但也不免要经历其它企业一般成长的阵痛.尤其是在「一夜长大」的过程中,独角兽们历经了员工数量的迅速膨胀.组织机构的急速扩张.业务方向的激烈动荡,甚至是外部环境的风云变幻. 可是他们终究成长了起来,如同许多年前第一把点燃中国民营经济之火的初代创业者一般

「SCOI2012」喵星球上的点名

「SCOI2012」喵星球上的点名 填一个很久以前用 \(\texttt{AC}\) 自动机没填上的坑. 关于本题,能够通过本题的算法很多,这里作者采用的是后缀数组+树状数组的做法. 首先有一个显然的结论:若 \(s_2\) 是 \(s_1\) 的子串,则 \(s_1\) 一定存在一个后缀与 \(s_2\) 的最长公共前缀为 \(|s_2|\). 我们将读入的姓.名.询问串连成一个整体,形成一个字符串 \(s\),且在每一个姓.名.询问串中插入一个不存在文本中的字符,且保证询问串后插入的比姓名串

「随笔」基于当下的思考

马德,说好的技术blog,变成日记本了... 下午的时候莫名其妙的感到很颓废,因为自己的不够强大感到忧虑和危机感十足.现在每每行走在技术的道路上,常觉得如履薄冰,如芒在背. 上大学之前和现在的心态其实差别挺大的,视野的开阔远远不止局限于自己的脚下.不过,这里的「上大学之前」只是一个时间描述词,并不觉得大学是最适合学习的地方,我很失望. 世界上的人无论性别,区域,宗教,兴趣爱好,总可以在互联网上找到志趣相同的人,总是可以不断打破自己的常识与惯性思维.总是有在相同领域比自己更强的人,挺好的. 关于知