打卡信奥刷题(3521)用C++实现信奥题 P10948 升降梯上 📅 2026/8/22 23:00:04 P10948 升降梯上题目描述开启了升降梯的动力之后探险队员们进入了升降梯运行的那条竖直的隧道映入眼帘的是一条直通塔顶的轨道、一辆停在轨道底部的电梯、和电梯内一杆控制电梯升降的巨大手柄。NescafeˊNescaféNescafeˊ之塔一共有NNN层升降梯在每层都有一个停靠点。手柄有MMM个控制槽第iii个控制槽旁边标着一个数CiC_iCi满足C1C2C3⋯CMC_1 C_2 C_3 \dots C_MC1C2C3⋯CM。如果Ci0C_i0Ci0表示手柄扳动到该槽时电梯将上升CiC_iCi层如果Ci0C_i0Ci0表示手柄扳动到该槽时电梯将下降−Ci-C_i−Ci层并且一定存在一个Ci0C_i0Ci0手柄最初就位于此槽中。注意升降梯只能在1∼N1 \sim N1∼N层间移动因此扳动到使升降梯移动到111层以下、NNN层以上的控制槽是不允许的。电梯每移动一层需要花费222秒钟时间而手柄从一个控制槽扳到相邻的槽需要花费111秒钟时间。探险队员现在在111层并且想尽快到达NNN层他们想知道从111层到NNN层至少需要多长时间输入格式第一行两个正整数N、MN、MN、M。第二行MMM个整数C1,C2,…CMC_1,C_2,\dots C_MC1,C2,…CM。输出格式输出一个整数表示答案即至少需要多长时间。若不可能到达输出−1-1−1。输入输出样例 #1输入 #16 3 -1 0 2输出 #119说明/提示数据保证1≤N≤10001 \le N \le 10001≤N≤10002≤M≤202 \le M \le 202≤M≤20$-N C_1 C_2 … C_M N $。C实现#includebits/stdc.husingnamespacestd;constintN1e35,M25,INF0x3f3f3f3f;intn,m;boolvis[N];intc[M],dis[N];structNode{intx,h,s;booloperator(constNodeA)const{returnsA.s;}};priority_queueNodeq;inlineintread(){intx0,f1;charcgetchar();while(!isdigit(c)){f(c-?-1:1);cgetchar();}while(isdigit(c)){x(x3)(x1)(c^48);cgetchar();}returnx*f;}voiddijkstra(){while(!q.empty()){intuq.top().x,hq.top().h;q.pop();if(vis[u]){continue;}vis[u]1;for(inti1;im;i){intvuc[i],wabs(h-i)2*abs(c[i]);if(v1||nv){continue;}if(dis[v]dis[u]w){dis[v]dis[u]w;if(!vis[v]){q.push({v,i,dis[v]});}}}}}intmain(){memset(dis,0x3f,sizeofdis);nread();mread();for(inti1;im;i){c[i]read();if(!c[i]){q.push({1,i,dis[1]0});}}dijkstra();if(dis[n]INF){dis[n]-1;}printf(%d\n,dis[n]);return0;}后续接下来我会不断用C来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现记录日常的编程生活、比赛心得感兴趣的请关注我后续将继续分享相关内容