TYVJ 2032 搜索
P2032 「Poetize9」升降梯上
描述
开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道、一辆停在轨道底部的电梯、和电梯内一杆控制电梯升降的巨大手柄。
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。
思路:
看到这题,第一反应。 搜XXD! 看了看数据范围。。 觉得搜好像会超时。但还是花了20min把一发暴搜写出来了。竟然AC了!代码还很短。
后来分析了一下原因,发现我在不经意之间加了一个强悍的剪枝。就是把visit数组设成int的,记录到那层的最短时间,如果比它短,则更新,搜它。否则不搜它。
#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; int n,m,c[66],ans=1000000,si,v[1005]; void dfs(int x,int t,int ii) { if(x==n) ans=min(ans,t); for(int i=1;i<=m;i++) { if(x+c[i]>=1&&x+c[i]<=n&&c[i]&&v[x+c[i]]>t+abs(ii-i)+abs(c[i])*2) { v[x+c[i]]=t+abs(ii-i)+abs(c[i])*2; dfs(x+c[i],t+abs(ii-i)+abs(c[i])*2,i); } } } int main() { memset(v,0x3f,sizeof(v)); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d",&c[i]); if(c[i]==0) si=i; } dfs(1,0,si); if(ans!=1000000)printf("%d",ans); else printf("-1"); }
- hdu2955 01背包
- struts2——(8)(①3种情况通配符的使用方法②动态方法调用 )
- 大道至简阅读笔记01
- 接续符和转义符
- 正则表达式初学习
- HTTP 请求方式: GET和POST的比较
- .net的锁
- 能不转发的就不要转发——记一次文件下载丢包填坑之旅
- [Audio processing] wav音频文件读取int和double数组的关系
- 语义化标签,和类名说再见
- 二叉树系列——二叉树的定义以及各种遍历方式
- 【LeetCode】278. First Bad Version
- 2016SDAU课程练习一1016Q
- 47. Permutations II LeetCode
- 线程间协作:wait、notify、notifyAll
- 展示浮点数格式C代码
- 关于java对象复制clone 给一个对象赋值 会随原来的对象变化
- C-SCAUoj 删除字符串中的空格
- Android之Sqlite数据库的使用
- +++JavaScript split() 方法+++