计蒜客 跳跃游戏(贪心)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计蒜客 跳跃游戏(贪心)相关的知识,希望对你有一定的参考价值。
给定一个非负整数数组,假定你的初始位置为数组第一个下标。数组中的每个元素代表你在那个位置能够跳跃的最大长度。
请确认你是否能够跳跃到数组的最后一个下标。
例如:
A = [2,3,1,1,4],
return ture
A = [3,2,1,0,4],
return false.
格式:
第一行输入一个正整数n,接下来的一行,输入数组A[n]。如果能跳到最后一个下标,输出"true",否则输出"false"
样例1
????输入:????
????????5
????????2 0 2 0 1
????输出:
????????True
- #include <stdio.h>
- ???int main(){
- ??????????int n,i,max,maxi,j;
- ???????//maxi记录从当前能跳跃到的位置中"可达到距离最大"的位置
- ??????//max记录可跳跃的最大距离
- ??????scanf("%d",&n);
- ??????????int a[n];
- ??????????for(i = 0;i < n;i++)scanf("%d",&a[i]);
- ?
- ??????for(i = 0;i < n&&a[i];){//当a[i]==0,该位置即为可到达的最大位置
- ??????????????max=i + a[i];
- ????????????????maxi = i + 1;//这里是为了防止进入死循环,保证能够达到退出循环的条件,因为a[i]>0,故这里不会造成错误
- ??????????????for(j = i + 1;j < n&&j <= i + a[i];j++){
- ?????????????????????if(j + a[j] >= max){
- ????????????????????????max = j + a[j];
- ?????????????????????????maxi = j;
- ?????????????????????}
- ??????????????}//打擂更新获得maxi
- ??????????????i = maxi;
- ??????????}
- ????????if(i >= n - 1)printf("true");
- ??????????else printf("false");
- ?
- ??????????return 0;
- ???}
?
这道题应使用贪心的算法(思路?)来解决,对于题目给出的数列,从第一个数开始,寻找该数可跳跃到的"可到达距离最大"的位置
直至到达可到达的最大位置
例如,对于样例,各个位置可到达的最远距离为
0+2,1+0,2+2,3+0,4+1
从第一个位置,我们可跳跃至 1 2 两个位置,我们理应选择 2位置,因为其可到达距离更远,选择它后下一步决策才有可能得出最优选择
(即跳跃到可到达距离最大的位置)因为 1 "可以跳跃到的" 任何大于2 的位置 2 都可以跳跃到,且 2 可跳跃到的 1 不一定能跳跃到,
当然,以上情况中,我们选取的 maxi 位置 比 其他位置 都小,故上述推论正确,但是,如果,maxi大于其他位置
比如 对于 输入数据 3 1 2 4 1 0 0
各个位置可到达的最远距离为
3 2 4 7 5 5 6
从 0 位置我们可以跳至 1 2 3 位置,按照上述思路,我们应当选择 跳至3 号位置 ,但是存在3 号位置无法跳跃到但 1 号 位置可以跳跃到
的位置 --2 号位置,有没有可能 因此错过最优解呢?不可能,因为 任意 2 号 位置 可到达的位置 3 号都可以到达 。总之,任何其他位置可以
直接或间接到达的位置,maxi位置都可以到达,故这样的贪心选择不会遗漏最优解。
个人吐槽,这题看完后我基本是2 3 分钟就想出来算法,但我实现起来尼玛花了整整 2 30分钟。。各种特殊情况与可能出现的死循环让我搞了好久
--__--!!
以上是关于计蒜客 跳跃游戏(贪心)的主要内容,如果未能解决你的问题,请参考以下文章