洛谷b3629吃冰棍解题

吃冰棍

题目描述

机器猫喜欢吃冰棍。

买一根冰棍,吃完了会剩一个木棒;每三个木棒可以兑换一个冰棍。兑换出来的冰棍,吃完之后也能剩下一个木棒。

所以,如果机器猫买了 5 根冰棍,他可以吃完之后得到 5 个木棒;拿 3 个木棒兑换 1 根冰棍,余 2 个木棒;吃完兑换来的冰棍之后,手上有 3 个木棒,又能兑换一个冰棍。最后,机器猫实际上吃了 7 个冰棍。

机器猫想要吃到 $n$ 个冰棍,想问最开始至少需要去买多少根冰棍?

输入格式

仅一行,一个正整数,表示 $n$。

输出格式

仅一行,一个正整数,表示需要买的冰棍数量。

样例 #1

样例输入 #1

7

样例输出 #1

5

样例 #2

样例输入 #2

20

样例输出 #2

14

提示

数据规模与约定

对于 $100%$ 的数据,$1\leq n \leq 100000000$。

k个木棒=冰棍+1个木棒。
所以k-1个木棒=1个冰棍。
刚开始是n个冰棍的话,那我就可以得到n个木棒。
所以总共能吃n+(n-1)/(k-1)个冰棍,再反过来求解就行了(n-1是要减去最后一根木棒,不然就是k-1个木棒去换一个冰棍了。)

【以下回答由 GPT 生成】

思路解析

根据题目要求,机器猫买了n根冰棍后,可以得到n个木棒。由于每3个木棒可以兑换1根冰棍,所以可以将每个兑换出来的冰棍又当作买来的冰棍去计算。

假设初始买的冰棍数为x,n为目标吃到的冰棍数。根据题目叙述,得到的木棒数等于x,使用x/3个木棒兑换了x/3个冰棍。吃完兑换来的冰棍后,剩下的木棒数为x%3,可以继续使用这些剩下的木棒去兑换冰棍。

根据上述逻辑,可以使用循环来逐步计算机器猫需要买的冰棍数量,直到得到的冰棍数大于等于n。

算法步骤如下: 1. 定义一个变量x,初始值为n。 2. 定义一个变量count,初始值为n。count表示需要买的冰棍数量。 3. 进入循环,判断x是否大于等于3,如果大于等于3,执行步骤4,否则执行步骤6。 4. 将x/3加到count上,并将x的值更新为x/3 + x%3。这表示使用x/3个木棒兑换了x/3个冰棍,剩下的木棒数为x%3。 5. 重复步骤3。 6. 循环结束后,count的值就是需要买的冰棍数量。 7. 返回count。

代码实现

def solve(n):
    x = n
    count = n
    while x >= 3:
        count += x // 3
        x = x // 3 + x % 3
    return count

复杂度分析

由于每次循环,x的值都至少减少1/3,所以循环的次数不会超过3次。因此,时间复杂度为O(1)。

空间复杂度为O(1),只需要常数个变量来存储计算过程中的值。



【相关推荐】


  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7416623
  • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 名字好听,其实就是直接插入的升级版,主要是插牌的性能差距太大,如果有序,那么插排的事件负责度就是O(N)但是如果排一个逆序他就是O(N^2)。那么引进希尔排序,它就是做一次(多次)预排序让你的排序,尽可能的有序,然后再插排。这样复杂度就明显减小。首先我们将无序数组先进行分组,三个一分,五个一分,十个一分,都行。把小组内成员,进行插排。然后排好的序列其实已经很接近有序了(分的越少越接近,但是分的太少,复杂度也就越大,分组越多,排序次数也就越少。)所以希尔就提出了一个动态的去选择分组的方法。gap=size/3+1(组),例如20个元素,第一次分7组,第二次7/3+1=3组,然后2组,然后1组。 部分也许能够解决你的问题。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^