[tyvj2032]升降梯上<dp&spfa>
题目背景
开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道、一辆停在轨道底部的电梯、和电梯内一杆控制电梯升降的巨大手柄。
题目描述
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。
输入输出样例
6 3
-1 0 2
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实现
#include<cstdio>
#include<queue>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#define maxn 1005
#define maxm 22
using namespace std; int n,m,a[maxm],s,ans=0x3f3f3f,f[maxn][maxm];
int cando=,val[maxn][maxm]; void change()
{
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
val[i][j]=f[i][j];
} void check()
{
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
if(val[i][j]!=f[i][j]){
cando=;return;//有变动
}
}
cando=;//无变动
} int main()
{
memset(f,0x3f3f3f,sizeof(f));
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
scanf("%d",&a[i]);if(a[i]==)s=i;
}
f[][s]=;
for(int i=;i<=m;i++){if(i!=s)f[][i]=abs(s-i);} while(cando==){
change();
for(int i=n;i>=;i--)
{
for(int j=;j<=m;j++)
{
if(j!=s){
int ncnt=i-a[j];
if(ncnt<||ncnt>n)continue;
for(int k=;k<=m;k++){
if(k!=s){
int ntim=abs(k-j)+abs(a[j])*;
f[i][j]=min(f[i][j],ntim+f[ncnt][k]);
}
}
}
if(i==n)ans=min(ans,f[n][j]);
}
}
check();
} if(ans==0x3f3f3f)printf("-1");
else printf("%d",ans);
}
[tyvj2032]升降梯上<dp&spfa>的更多相关文章
- [Tyvj2032]升降梯上(最短路)
[Tyvj2032]升降梯上 Description 开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道.一辆停在轨道底部的电梯.和电梯内一杆控制电梯升 ...
- TYVJ2032 升降梯上
Description: 开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道.一辆停在轨道底部的电梯.和电梯内一杆控制电梯升降的巨大手柄.Nescafe ...
- [正经分析] DAG上dp两种做法的区别——拓扑序与SPFA
在下最近刷了几道DAG图上dp的题目. 要提到的第一道是NOIP原题<最优贸易>.这是一个缩点后带点权的DAG上dp,它同时规定了起点和终点. 第二道是洛谷上的NOI导刊题目<最长路 ...
- TYVJ2032 「Poetize9」升降梯上
P2032 「Poetize9」升降梯上 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道, ...
- 升降梯上——玄学dp
升降梯上 题目描述 开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道.一辆停在轨道底部的电梯.和电梯内一杆控制电梯升降的巨大手柄. \(Nescafe ...
- POJ 3182 The Grove [DP(spfa) 射线法]
题意: 给一个地图,给定起点和一块连续图形,走一圈围住这个图形求最小步数 本来是要做课件上一道$CF$题,先做一个简化版 只要保证图形有一个点在走出的多边形内就可以了 $hzc:$动态化静态的思想,假 ...
- DAG上dp思想
DAG上DP的思想 在下最近刷了几道DAG图上dp的题目.要提到的第一道是NOIP原题<最优贸易>.这是一个缩点后带点权的DAG上dp,它同时规定了起点和终点.第二道是洛谷上的NOI导刊题 ...
- BZOJ1003物流運輸 DP + SPFA
@[DP, SPFA] Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要\(n\)天才能运完.货物运输过程中一般要转 停好几个码头.物流公司通常会设计一条固定的运 ...
- bzoj1093: [ZJOI2007]最大半连通子图 scc缩点+dag上dp
一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G'=(V ...
随机推荐
- WebGIS 利用 WebGL 在 MapboxGL 上渲染 DEM 三维空间数据
毕业两年,一直在地图相关的公司工作,虽然不是 GIS 出身,但是也对地图有些耳濡目染:最近在看 WebGl 的东西,就拿 MapboxGL 做了一个关于 WebGL 的三维数据渲染的 DEMO 练手. ...
- 前端每日实战:119# 视频演示如何用纯 CSS 创作一个接扎啤的动画(内含2个视频)
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/rZeOQp 可交互视频 此视频是可 ...
- HTML、CSS笔记
盒模型 在CSS中,使用标准盒模型描述这些矩形盒子中的每一个.这个模型描述了元素所占空间的内容.每个盒子有四个边:外边距边, 边框边, 内填充边 与 内容边. 在标准模式下,一个块的总宽度= widt ...
- DvaJS入门课
不管是Vue还是React,他们都没解决组件间的通信和数据流问题.当然,这个说法不是很准确,准确的说法是他们都没很好的处理这些问题.我们是可以用一些烂手段去解决这个问题,但是当应用比较大.数据多的时候 ...
- Vue2.0 【第二季】第3节 Vue.set全局操作
目录 Vue2.0 [第二季]第3节 Vue.set全局操作 第3节:Vue.set全局操作 一.引用构造器外部数据 二.在外部改变数据的三种方法: 三.为什么要有Vue.set的存在? Vue2.0 ...
- Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
将 RCN 中下面 3 个独立模块整合在一起,减少计算量: CNN:提取图像特征 SVM:目标分类识别 Regression 模型:定位 不对每个候选区域独立通过 CN 提取特征,将整个图像通过 CN ...
- 解决QQ“抱歉,无法发起临时会话,您可以 添加对方为好友以发送消息”
很多网站,目前无法发起临时会话,自己在找网上找到教程,特分享给大家.自从2014年3月1日开始,网站上放置QQ客服代码的网站,在点击联系QQ时,以前可以正常发起临时会话的,现在提示:“抱歉,无法发起临 ...
- 爬虫 | cnblog文章收藏排行榜(“热门文摘”)
目录 需要用的module 单页测试 批量抓取 数据保存 背景说明 因为加入cnblog不久,发现上面有很多优秀的文章. 无意中发现cnblog有整理文章的收藏排行榜,也就是热门文摘. 不过有点坑的是 ...
- 解决tinyint映射成boolean/byte的问题
前言 最近受疫情的影响,公司要做一个类似一码通的系统为客户服务.由我来进行表的设计.创建表之后需要逆向生成Java的entity.mapper.mapper.xml.由于我在数据库中定义了大量 tin ...
- Block详解二(底层分析)
Block专辑: Block讲解一 MRC-block与ARC-block Block详解一(底层分析) 今天讲述Block的最后一篇,后两篇仅仅是加深1,2篇的理解,废话少说,开始讲解! __blo ...