【思维构造】跳跃游戏
题干:
有一种跳跃游戏:假设初始位置在数轴的原点处,每一次可以选择两种操作: 向前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;
}
【思维构造】跳跃游戏相关推荐
- 跳跃游戏 (动态规划剪枝/前缀和/滑动窗口/BFS剪枝)
一.跳跃游戏简单介绍 1. 跳跃游戏简单介绍 跳跃游戏是一种典型的算法题目,经常是给定一数组arr,从数组的某一位置i出发,根据一定的跳跃规则,比如从i位置能跳arr[i]步,或者小于arr[i]步, ...
- 贪心——跳跃游戏 II(Leetcode 45)
题目选自 Leetcode 45. 跳跃游戏 || 与跳跃游戏 | 的不同之处在于,我们需要求的是最少的跳跃次数~ 题目描述: 解题思路: 思想 就一句话:每次在上次能跳到的范围(end)内选择一个能 ...
- leetcode-45 跳跃游戏II
给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: [2,3,1,1,4] 输 ...
- LeetCode-笔记-45.跳跃游戏II-贪心算法
LeetCode-笔记-45.跳跃游戏II-贪心算法 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后 ...
- 《LeetCode力扣练习》第55题 跳跃游戏 Java
<LeetCode力扣练习>第55题 跳跃游戏 Java 一.资源 题目: 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 . 数组中的每个元素代表你在该位置可以跳跃的最大 ...
- LeetCode 55. 跳跃游戏 中等难度
55. 跳跃游戏 题目: 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1:输入: [2,3,1,1, ...
- Leetcode1696. 跳跃游戏 VI[C++题解]:dp和单调队列求滑动窗口最值
文章目录 题目分析 题目链接 单调队列板子链接 Deque知识补充 题目分析 题目重述:给定一个数组(有正数有负数)和一个步长k,从下标0处开始往前跳,每次最多往前跳k步.求跳到最后一个位置,得分之和 ...
- LeetCode:跳跃游戏【55】
LeetCode:跳跃游戏[55] 题目描述 给定一个非负整数数组,你最初位于数组的第一个位置.数组中的每个元素代表你在该位置可以跳跃的最大长度.判断你是否能够到达最后一个位置. 示例 1: 输入: ...
- LeetCode 55跳跃游戏56合并区间57插入区间
原创公众号:bigsai 希望和优秀的你做朋友,感觉不错还请一键三连. 回复进群即可加入和200+人一起打卡.上周打卡: LeetCode 47全排列Ⅱ&48旋转图像 LeetCode 49字 ...
最新文章
- html标签简介(常用)
- mysql8報錯解決方案彙總(持續更新中)
- for循环中一个不容小觑的问题
- [js] axios为什么可以使用对象和函数两种方式调用?是如何实现的?
- Javascript图像处理——图像形态学
- NodeJS自定义包和模块的导入(require)、导出(exports)
- Journey源码分析二:整体启动流程
- linux dvd 刻录_如何将任何视频文件刻录到可播放的DVD
- php session fixation,Session Fixation 原理与防御
- 女生适合做软件开发工作吗?优势在哪里?
- 李嘉诚、英特尔、比亚迪入股的雷蛇,上市后能玩把大的吗?
- Java 获取指定日期
- java实现端口映射_Java BIO实现TCP端口转发(端口映射)功能源码
- PTA寒假基础题训练(含解题思路)(中)
- 城东C位之路!探秘三线楼市板块崛起3大核心基因
- android 分享到qq黑屏,为什么我的手机打开QQ好友动态就会黑屏?
- 企业数据分析工作的任务、工具及挑战
- 优动漫PAINT-百褶裙绘制教程
- 2016云计算大会PPT打包下载
- Pandas统计分析基础(5):DataFrame的合并(内含大量代码可供练习)
热门文章
- Windows 8 JavaScript Metro应用程序--入门(上)
- ★ Flex を使って Scalable Vector Graphics とビットマップを描画する
- 基于Visual Studio2010讲解LINQ读出数据库数据生成XML
- 常州win8如何禁用应用商店_Win8系统当中Windows defnedder安全软件应该如何禁用?...
- 获取弹出的窗口_Win7系统如何获取设置everyone权限的问题
- ff14拆区后哪个服务器人最多,FF14拆区可以转服吗 拆区期间转服教程
- 16位计算机cpu电路图,简单16位CPU设计.doc
- HMI使用自定义控件流程
- N101BCG-L21-10.1-LVDS
- C++设计模式之三 单例模式