A strange lift

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 8   Accepted Submission(s) : 7

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

There is a strange lift.The lift can stop can at every floor as you want, and there is a number Ki(0 <= Ki <= N) on every floor.The lift have just two buttons: up and down.When you at floor i,if you press the button "UP" , you will go up Ki floor,i.e,you will go to the i+Ki th floor,as the same, if you press the button "DOWN" , you will go down Ki floor,i.e,you will go to the i-Ki th floor. Of course, the lift can't go up high than N,and can't go down lower than 1. For example, there is a buliding with 5 floors, and k1 = 3, k2 = 3,k3 = 1,k4 = 2, k5 = 5.Begining from the 1 st floor,you can press the button "UP", and you'll go up to the 4 th floor,and if you press the button "DOWN", the lift can't do it, because it can't go down to the -2 th floor,as you know ,the -2 th floor isn't exist.
Here comes the problem: when you are on floor A,and you want to go to floor B,how many times at least he has to press the button "UP" or "DOWN"?

Input

The input consists of several test cases.,Each test case contains two lines.
The first line contains three integers N ,A,B( 1 <= N,A,B <= 200) which describe above,The second line consist N integers k1,k2,....kn.
A single 0 indicate the end of the input.

Output

For each case of the input output a interger, the least times you have to press the button when you on floor A,and you want to go to floor B.If you can't reach floor B,printf "-1".

Sample Input

5 1 5
3 3 1 2 5
0

Sample Output

3
#include<iostream>
using namespace std;
#define INF 0x3f3f3f3f
int f[250][2];
int s[250];
int dp[250];
int min(int a,int b)
{return a<b?a:b;
}
int main()
{int n,a,b;int i,j;int num;while(cin>>n&&n){cin>>a>>b;memset(f,0,sizeof(f));for(i=1;i<=n;i++){scanf("%d",&s[i]);if(i-s[i]>=1){f[i][0]=i-s[i];}if(i+s[i]<=n){f[i][1]=i+s[i];}}memset(dp,0x3f,sizeof(dp));dp[a]=0;while(true){num=0;for(i=1;i<=n;i++){if(dp[i]<INF){for(j=0;j<2;j++){if(f[i][j]){if(dp[f[i][j]]>dp[i]+1){dp[f[i][j]]=dp[i]+1;num++;}}}}}if(num==0){break;}}if(dp[b]==INF){printf("-1\n");}else{printf("%d\n",dp[b]);}}return 0;
}
编程中无穷大常量的设定技巧:引用自:http://aikilis.tk/

如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,很多程序员都取0x7fffffff作为无穷大,因为这是32-bit int的最大值。如果这个无穷大只用于一般的比较(比如求最小值时min变量的初值),那么0x7fffffff确实是一个完美的选择,但是在更多的情况下,0x7fffffff并不是一个好的选择。
  1. 很多时候我们并不只是单纯拿无穷大来作比较,而是会运算后再做比较,例如在大部分最短路径算法中都会使用的松弛操作:
    if (d[u]+w[u][v]<d[v]) d[v]=d[u]+w[u][v];
    我们知道如果u,v之间没有边,那么w[u][v]=INF,如果我们的INF取0x7fffffff,那么d[u]+w[u][v]会溢出而变成负数,我们的松弛操作便出错了,更一般的说,0x7fffffff不能满足“无穷大加一个有穷的数依然是无穷大”,它变成了一个很小的负数。
  2. 除了要满足加上一个常数依然是无穷大之外,我们的常量还应该满足“无穷大加无穷大依然是无穷大”,至少两个无穷大相加不应该出现灾难性的错误,这一点上0x7fffffff依然不能满足我们。
所以我们需要一个更好的家伙来顶替0x7fffffff,最严谨的办法当然是对无穷大进行特别处理而不是找一个很大很大的常量来代替它(或者说模拟它),但是这样会让我们的编程过程变得很麻烦。在我读过的代码中,最精巧的无穷大常量取值是0x3f3f3f3f,我不知道是谁最先开始使用这个精妙的常量来做无穷大,不过我的确是从一位不认识的ACMer(ID:Staginner)的博客上学到的,他/她的很多代码中都使用了这个常量,于是我自己也尝试了一下,发现非常好用,而当我对这个常量做更深入的分析时,就发现它真的是非常精巧了。
  1. 0x3f3f3f3f的十进制是1061109567,也就是10^9级别的(和0x7fffffff一个数量级),而一般场合下的数据都是小于10^9的,所以它可以作为无穷大使用而不致出现数据大于无穷大的情形。
  2. 另一方面,由于一般的数据都不会大于10^9,所以当我们把无穷大加上一个数据时,它并不会溢出(这就满足了“无穷大加一个有穷的数依然是无穷大”),事实上0x3f3f3f3f+0x3f3f3f3f=2122219134,这非常大但却没有超过32-bit int的表示范围,所以0x3f3f3f3f还满足了我们“无穷大加无穷大还是无穷大”的需求。
  3. 最后,0x3f3f3f3f还能给我们带来一个意想不到的额外好处:如果我们想要将某个数组清零,我们通常会使用memset(a,0,sizeof(a))这样的代码来实现(方便而高效),但是当我们想将某个数组全部赋值为无穷大时(例如解决图论问题时邻接矩阵的初始化),就不能使用memset函数而得自己写循环了(写这些不重要的代码真的很痛苦),我们知道这是因为memset是按字节操作的,它能够对数组清零是因为0的每个字节都是0,现在好了,如果我们将无穷大设为0x3f3f3f3f,那么奇迹就发生了,0x3f3f3f3f的每个字节都是0x3f!所以要把一段内存全部置为无穷大,我们只需要memset(a,0x3f,sizeof(a))。
所以在通常的场合下,0x3f3f3f3f真的是一个非常棒的选择。

HDU A strange lift相关推荐

  1. hdu 1548 A strange lift

    A strange lift Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Tota ...

  2. A strange lift HDU - 1548(基础广搜)

    There is a strange lift.The lift can stop can at every floor as you want, and there is a number Ki(0 ...

  3. SDAU 搜索专题 13 A strange lift

    1:问题描述 Problem Description There is a strange lift.The lift can stop can at every floor as you want, ...

  4. hdu 1548 A strange lift (BFS)

    解题思路:BFS 注意点:每次查询结束后,要清空队列 #include <iostream> #include <queue> #include <cstring> ...

  5. 模拟退火 HDU - 2899 Strange Function

    Strange Function [ HDU - 2899 ] 题目大意: 函数 F(x) = 6x7 + 8x6 + 7x3 + 5x2 - yx, 其中x的范围是0 ≤ x ≤ 100. 输入y值 ...

  6. HDU1548:A strange lift(Dijkstra或BFS)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1548 题意:电梯每层有一个数,例如第n层有个数k, 那么这一层只能上k层或下k层,但是不能低于一层或高 ...

  7. hdu 2988 Strange fuction【模拟退火】

    计算:给出y ,    的最小值 wa到哭啊,简直上火了,是板子没有套对, nex=now+T*i;//新解 T*i是变化的范围加上原先的才是新解, 还有精确度,因为评估函数要平方,所以要高一些 最终 ...

  8. 【转载】图论 500题——主要为hdu/poj/zoj

    转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  9. 【HDOJ图论题集】【转】

    1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...

最新文章

  1. html form提交前验证,form表单提交前验证实现方法
  2. MemCache在Windows环境下的搭建及启动
  3. HDU1160:FatMouse's Speed(最长上升子序列,不错的题)
  4. WIN7无法记住远程登录密码
  5. [转载][QT][SQL]sql学习记录3_sqlite之update delete like
  6. 《C和指针》——字符串常量实际上是个指针,你真的懂了么?
  7. iOS 工程中引入另一个工程,多工程管理
  8. redis缓存命中率计算
  9. 介绍计算机课程英语作文,关于电脑课的英语作文
  10. iphone/ipad 横竖屏切换
  11. android 密码输入框 星号,input密码框输入后设置显示为星号或其他样式
  12. FTP上传和WEB上传的区别
  13. 挖矿病毒audiodg.exe\taskhost.exe溯源与手动查杀方法
  14. 老版人人商城提示“百度未授权地图API”
  15. Redis(五)深入了解Redis核心设计原理 SDS类型(String)redis如何扩容 五种结构底层数据结构 结构变换条件 如何配置条件 GEO使用 ACL
  16. 如何搭建KBQA系统 —— 初识KBQA(一)
  17. 京东API、获得JD商品详情API调取数据部分代码展示
  18. 数字信号时序电路_数字电子中的时序电路
  19. 范型方法 范型参数 范型返回值
  20. 畅写Office云端SDK :“硬核”赋予企业应用在线文档I在线协作编辑I在线预览I在线格式转换服务

热门文章

  1. MAX232芯片的用法及实际应用
  2. 在Linux下将PNG和JPG批量互转的四种方法
  3. 创业黑马|泰瑞数创:坚持数字孪生的硬核之路 不刻意追逐元宇宙风口
  4. DSP仿真器Debug
  5. 红帽认证工程师及红帽认证技师应试指南
  6. android不显示http的网络图片
  7. AE2022装不了SVGA导出插件
  8. 如何使用eeglab画出理想的脑电图
  9. 三小时学会V语言到放弃(第一小时)
  10. dpresult在python中什么意思_动态规划(DP)的整理-Python描述