计蒜客 跳跃游戏(贪心)

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

  1. #include <stdio.h>
  2. ???int main(){
  3. ??????????int n,i,max,maxi,j;
  4. ???????//maxi记录从当前能跳跃到的位置中"可达到距离最大"的位置
  5. ??????//max记录可跳跃的最大距离
  6. ??????scanf("%d",&n);
  7. ??????????int a[n];
  8. ??????????for(i = 0;i < n;i++)scanf("%d",&a[i]);
  9. ?
  10. ??????for(i = 0;i < n&&a[i];){//当a[i]==0,该位置即为可到达的最大位置
  11. ??????????????max=i + a[i];
  12. ????????????????maxi = i + 1;//这里是为了防止进入死循环,保证能够达到退出循环的条件,因为a[i]>0,故这里不会造成错误
  13. ??????????????for(j = i + 1;j < n&&j <= i + a[i];j++){
  14. ?????????????????????if(j + a[j] >= max){
  15. ????????????????????????max = j + a[j];
  16. ?????????????????????????maxi = j;
  17. ?????????????????????}
  18. ??????????????}//打擂更新获得maxi
  19. ??????????????i = maxi;
  20. ??????????}
  21. ????????if(i >= n - 1)printf("true");
  22. ??????????else printf("false");
  23. ?
  24. ??????????return 0;
  25. ???}

?

这道题应使用贪心的算法(思路?)来解决,对于题目给出的数列,从第一个数开始,寻找该数可跳跃到的"可到达距离最大"的位置

直至到达可到达的最大位置

例如,对于样例,各个位置可到达的最远距离为

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分钟。。各种特殊情况与可能出现的死循环让我搞了好久

--__--!!

以上是关于计蒜客 跳跃游戏(贪心)的主要内容,如果未能解决你的问题,请参考以下文章

运用NP求解 “跳跃游戏”---计蒜客

计蒜客 跳跃游戏

计蒜客 跳跃游戏2

计蒜客_跳跃游戏

计蒜客-题库-跳跃游戏2

计蒜客-跳跃游戏二 (简单dp)