1319 跳跃游戏
题目来源: TopCoder
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题

 收藏
 关注

有一个可以在二维平面上做跳跃的机器人,该机器人有独特的跳跃程序。该程序的跳跃距离是由一个循环序列S决定的。序列S有无穷多项,但其有一个最小周期序列,令其为A,A中有N个元素(N<=50),S[i]=A[i mod N],i从0取到正无穷。例如,A={2,5,1,1}那么S={2,5,1,1,2,5,1,1,2,5,1,1.....}。机器人的跳跃规则如下:第k次跳跃时,机器人可以跳出离原来位置S[k]的距离外,方向随意,其中k=0,1,2,3,...。这个方向是由机器人的控制玩家自己决定的,它可以是0~360度内的任意一个方向,角度未必是整数,落点也未必是整点。注意,控制玩家不能控制跳跃的距离,这个距离是机器人的自身属性即A序列决定的;玩家只能决定每一次跳跃的方向。现在,你需要让机器人从平面的(0,0)处跳跃到(x,0)处,求出最少需要控制机器人跳跃几次。其中,初始(第0次)跳跃距离恰为S[0]。

例如:x=5,A={3,4},(0,0)->(9/5,12/5)->(5,0)。
Input
第一行一个整数T,表示测试数据的数量,1<=T<=10。
接下来有T组相同格式的数据。
每组数据的第一行包含两个整数x、N,其中 -1,000,000,000<=x<=1,000,000,000 , 1<=N<=50。
接下来N行,每行一个整数A[i],其中1<=A[i]<=1,000,000,000。
Output
每组测试数据输出一行一个整数,即能使机器人完成任务最少跳跃的次数。
Input示例
2
5 1
5
1 1
10
Output示例
1
2
孔炤 (题目提供者)
题目思路很清晰:
最少步骤到达终点必定是构成多边形(可以把直线当做三边重合讨论)
(1)不超过两次循环至少能到达终点,此时在走的过程中必能构成三角形
(2)终点很远,很容易想到当所走的距离大于等于终点即能构成三角形
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define maxn 105
#define inf 0x3f3f3f3f
typedef long long ll;
ll a[maxn],b[maxn];
int  main()
{ll T,i,num,ans,n,x,sum;scanf("%lld",&T);while(T--){sum=0;memset(b,0,sizeof(b));scanf("%lld%lld",&x,&n);if(x<0)x=-x;for(i=1;i<=n;i++){scanf("%lld",&a[i]);sum+=a[i];b[i]=max(b[i-1],a[i]);//保存当前所有边的最大值}ans=x/sum*n;//刚开始沿直线走的次数num=x/sum*sum;;//当前沿直线走的距离if(x==0){printf("0\n");continue;}if(ans<2*n){ans=num=0;for(i=1;i<=2*n;i++){num+=a[(i-1)%n+1];ans++;if(num>=x && num+x>=2*b[min(n,i)])//三角形定理://当三角形两个最小边长之和大于最大边长时//必然可以构成三角形,变形得:三角形周长大于//2倍的最大边长即可break;}printf("%lld\n",ans);continue;}for(i=1;i<=n;i++){if(num>=x)break;num+=a[i];ans++;}printf("%lld\n",ans);}
}

51Nod-1319-跳跃游戏(三角形定理)相关推荐

  1. leetcode-45 跳跃游戏II

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

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

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

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

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

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

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

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

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

  6. LeetCode:跳跃游戏【55】

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

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

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

  8. LeetCode 45跳跃游戏46全排列

    原创公众号:bigsai,回复进群加入力扣打卡群. 昨日打卡:LeetCode 42字符串相乘&43通配符匹配 跳跃游戏 题目描述: 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中 ...

  9. 【LeetCode 55】【LeetCode 45】 跳跃游戏

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

最新文章

  1. C语言fgetpos()函数:获得当前文件的读写指针(转)
  2. 基于OpenCV的膨胀和腐蚀
  3. laytpl遍历实体列表_Layui数据表格之获取表格中所有的数据方法
  4. 前端学习(2269)vue造轮子之添加icon
  5. leetcode124. 二叉树中的最大路径和
  6. 一程序员被判 9 个月:因薪酬等问题离职,rm -f * 删库,瘫痪 6 个小时
  7. 用PHP做一道单选选择题的页面,【大神看过来】根据一个用PHP做的单选投票,改成多选,且可显示...
  8. 职中计算机应用基础期末考试题,职中计算机应用基础期末试卷.doc
  9. yii CComponent组件 实例说明1
  10. 蜂鸣器基本介绍及实现程序
  11. Excel中去掉多余的网格线
  12. Django | ORM choices参数详解
  13. 电脑DNS被劫持怎么办
  14. Mocking and Stubbing
  15. C# 以MP3的格式将录制的音频数据写入文件流
  16. 【翻译】揭开HTML5的神秘面纱
  17. python只显示重复值_使用内置条件格式的OpenPyXL:重复值和唯一值
  18. M4A音频格式是如何转成MP3格式的?
  19. formCreate
  20. python正则表达式爬取网页数据_常用正则表达式爬取网页信息及HTML分析总结

热门文章

  1. 2017年8月3日 星期四 --出埃及记 Exodus 28:25
  2. 测试方案模板(性能测试为例子)
  3. 单晶xrd测试衍射仪法
  4. HTML配合js制作弹框,弹出信息框展示后台内容
  5. 如何理解和定义城市大脑
  6. 3.一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
  7. 收银怎样挂单和取单_6、银豹收银台-收银/挂单取单/货流/交接班
  8. 成品直播源码,实现在平台内部的搜索
  9. C++习题二:职工管理系统:
  10. 邮件服务器 之 利用debian sarge和postfix 2.1构建媲美ISP的邮件系统