小青蛙住在一条河边, 它想到河对岸的学校去学习。小青蛙打算经过河里的石头跳到对岸。 河里的石头排成了一条直线, 小青蛙每次跳跃必须落在一块石头或者岸上。 不过, 每块石头有一个高度, 每次小青蛙从一块石头起跳, 这块石头的高度就会下降 1 , 当石头的高度下降到 0 时小青蛙不能再跳到这块石头上(某次跳跃 后使石头高度下降到 0 是允许的)。 小青蛙一共需要去学校上 x 天课, 所以它需要往返 2 x 次。当小青蛙具有一个跳跃能力 y时, 它能跳不超过 y的距离。 请问小青蛙的跳跃能力至少是多少才能用这些石头上完 x次课。 输入格式 输入的第一行包含两个整数 n , x分别表示河的宽度和小青蛙需要去学校的天数。请注意 2 x才是实际过河的次数。 第二行包含 n − 1个非负整数 H 1 , H 2 , ⋯ , H n − 1 , 其中 H i >0,表示在河中与小青蛙的家相距 i 的地方有一块高度为 H i的石头,H i = 0表示这个位置没有石头。 输出格式 输出一行, 包含一个整数, 表示小青蛙需要的最低跳跃能力。 样例输入 5 1 1 0 1 0 样例输出 4帮我写出c语言代码并给出题目思路
时间: 2023-06-15 22:05:19 浏览: 186
基于c语言的青蛙过河小游戏设计与代码实现
题目思路:
这是一个典型的二分答案问题。我们可以通过二分来确定小青蛙的最低跳跃能力。具体来说,我们可以枚举每一次跳跃的起点和终点,然后判断是否能成功跳到对岸。如果能成功跳到对岸,则继续枚举下一次跳跃,否则需要调整跳跃能力。
判断能否成功跳到对岸,可以使用贪心的思想。我们可以从起点开始,每次选择当前能够跳到的最远的石头作为跳跃终点,然后再以当前终点作为起点,继续选择能够跳到的最远的石头作为下一次跳跃的终点,直到跳到对岸或者无法跳到更远的石头为止。
代码实现:
在代码实现中,我们可以先将石头的高度按照距离从小到大排序,然后每次枚举起点和终点时,只需要考虑当前终点之后的石头即可。这样可以大大减少枚举的次数,提高程序效率。
注意:在判断能否成功跳到对岸时,需要特别注意最后一次跳跃的情况,因为最后一次跳跃不需要落在石头上,而是直接跳到对岸。
代码如下:
阅读全文