题干:

有一种跳跃游戏:假设初始位置在数轴的原点处,每一次可以选择两种操作: 向前k步或向后一步(k为当前的移动次数,即第k次跳跃k步)。给定一个终点D(D>0),请问最少经过多少次跳跃能恰好到达终点。(你可以跳到数轴的负半轴上)。

输入格式:

输入一个整数D(1≤D≤1018),代表终点。

输出格式:

输出一个整数,代表恰好到达D的最少的跳跃步数。

输入样例1:

在这里给出一组输入。例如:

5

结尾无空行

输出样例1:

4

结尾无空行

hint: 0->1->3->6->5

输入样例2:

在这里给出一组输入。例如:

6

结尾无空行

输出样例2:

3

结尾无空行

hint: 0->1->3->6

解题报告:

对于这种构造的题目,先别想着通过证明得出一个策略。最好的思路是先想策略,或者说猜一个策略,然后去证明这个策略是最优的。

本题猜的策略就是一直向前跑,挑一步往后跑。

猜这个策略的原因:简单模拟下发现,如果一直往前跑,则肯定是最少的跳跃次数,但是有可能会跳过了。考虑能不能再多用一步跳回来。发现是可以的。

详细证明:如果都往前跳,则第i步的贡献是i,如果第x步(x>0)向后跳了,则贡献是-(x+1),所以我们只需要挑选合适的x,就能做到了。x=0要特判,即代码中sum-1=n的情况。

AC代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
long long n;
int main()
{cin>>n;long long l = 1, r = 1e10, mid, ans, sum;while(l <= r) {mid = (l+r)/2;sum = mid*(mid+1)/2;if(sum >= n) {ans = mid;r = mid - 1;}else {l = mid + 1;}}sum = ans * (ans + 1) / 2;if(sum-1 == n) cout << ans+1 << endl;else cout << ans << endl;return 0;
}

【思维构造】跳跃游戏相关推荐

  1. 跳跃游戏 (动态规划剪枝/前缀和/滑动窗口/BFS剪枝)

    一.跳跃游戏简单介绍 1. 跳跃游戏简单介绍 跳跃游戏是一种典型的算法题目,经常是给定一数组arr,从数组的某一位置i出发,根据一定的跳跃规则,比如从i位置能跳arr[i]步,或者小于arr[i]步, ...

  2. 贪心——跳跃游戏 II(Leetcode 45)

    题目选自 Leetcode 45. 跳跃游戏 || 与跳跃游戏 | 的不同之处在于,我们需要求的是最少的跳跃次数~ 题目描述: 解题思路: 思想 就一句话:每次在上次能跳到的范围(end)内选择一个能 ...

  3. leetcode-45 跳跃游戏II

    给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: [2,3,1,1,4] 输 ...

  4. LeetCode-笔记-45.跳跃游戏II-贪心算法

    LeetCode-笔记-45.跳跃游戏II-贪心算法 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后 ...

  5. 《LeetCode力扣练习》第55题 跳跃游戏 Java

    <LeetCode力扣练习>第55题 跳跃游戏 Java 一.资源 题目: 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 . 数组中的每个元素代表你在该位置可以跳跃的最大 ...

  6. LeetCode 55. 跳跃游戏 中等难度

    55. 跳跃游戏 题目: 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1:输入: [2,3,1,1, ...

  7. Leetcode1696. 跳跃游戏 VI[C++题解]:dp和单调队列求滑动窗口最值

    文章目录 题目分析 题目链接 单调队列板子链接 Deque知识补充 题目分析 题目重述:给定一个数组(有正数有负数)和一个步长k,从下标0处开始往前跳,每次最多往前跳k步.求跳到最后一个位置,得分之和 ...

  8. LeetCode:跳跃游戏【55】

    LeetCode:跳跃游戏[55] 题目描述 给定一个非负整数数组,你最初位于数组的第一个位置.数组中的每个元素代表你在该位置可以跳跃的最大长度.判断你是否能够到达最后一个位置. 示例 1: 输入: ...

  9. LeetCode 55跳跃游戏56合并区间57插入区间

    原创公众号:bigsai 希望和优秀的你做朋友,感觉不错还请一键三连. 回复进群即可加入和200+人一起打卡.上周打卡: LeetCode 47全排列Ⅱ&48旋转图像 LeetCode 49字 ...

最新文章

  1. html标签简介(常用)
  2. mysql8報錯解決方案彙總(持續更新中)
  3. for循环中一个不容小觑的问题
  4. [js] axios为什么可以使用对象和函数两种方式调用?是如何实现的?
  5. Javascript图像处理——图像形态学
  6. NodeJS自定义包和模块的导入(require)、导出(exports)
  7. Journey源码分析二:整体启动流程
  8. linux dvd 刻录_如何将任何视频文件刻录到可播放的DVD
  9. php session fixation,Session Fixation 原理与防御
  10. 女生适合做软件开发工作吗?优势在哪里?
  11. 李嘉诚、英特尔、比亚迪入股的雷蛇,上市后能玩把大的吗?
  12. Java 获取指定日期
  13. java实现端口映射_Java BIO实现TCP端口转发(端口映射)功能源码
  14. PTA寒假基础题训练(含解题思路)(中)
  15. 城东C位之路!探秘三线楼市板块崛起3大核心基因
  16. android 分享到qq黑屏,为什么我的手机打开QQ好友动态就会黑屏?
  17. 企业数据分析工作的任务、工具及挑战
  18. 优动漫PAINT-百褶裙绘制教程
  19. 2016云计算大会PPT打包下载
  20. Pandas统计分析基础(5):DataFrame的合并(内含大量代码可供练习)

热门文章

  1. Windows 8 JavaScript Metro应用程序--入门(上)
  2. ★ Flex を使って Scalable Vector Graphics とビットマップを描画する
  3. 基于Visual Studio2010讲解LINQ读出数据库数据生成XML
  4. 常州win8如何禁用应用商店_Win8系统当中Windows defnedder安全软件应该如何禁用?...
  5. 获取弹出的窗口_Win7系统如何获取设置everyone权限的问题
  6. ff14拆区后哪个服务器人最多,FF14拆区可以转服吗 拆区期间转服教程
  7. 16位计算机cpu电路图,简单16位CPU设计.doc
  8. HMI使用自定义控件流程
  9. N101BCG-L21-10.1-LVDS
  10. C++设计模式之三 单例模式