C语言基础题:吃冰棍(C语言版)

1.题目描述

机器猫喜欢吃冰棍。

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

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

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

2.输入格式

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

3.输出格式

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

4.输入输出样例

输入1:
cpp 复制代码
7
输出1:
cpp 复制代码
5
输入2:
cpp 复制代码
20
输出2:
cpp 复制代码
14

5.说明/提示

数据规模与约定

对于 100% 的数据,1 <n< 100000000.

代码:

cpp 复制代码
#include <stdio.h>

int main() {
    long long n;
    scanf("%lld", &n);

    long long left = 0, right = n; // 最少0根,最多n根
    long long result = n;

    while (left <= right) {
        long long mid = left + (right - left) / 2;
        long long totalIceCreams = mid; // 起始购买的冰棍数量
        long long sticks = mid; // 吃完后剩下的木棒

        // 计算可以吃到多少冰棍
        while (sticks >= 3) {
            long long newIceCreams = sticks / 3;
            totalIceCreams += newIceCreams;
            sticks = sticks % 3 + newIceCreams; // 剩下的木棒加上新的木棒
        }

        if (totalIceCreams >= n) {
            result = mid; // 可以满足条件,记录结果
            right = mid - 1; // 尝试更少的冰棍
        } else {
            left = mid + 1; // 需要更多的冰棍
        }
    }

    printf("%lld\n", result);
    return 0;
}
相关推荐
小灰灰搞电子1 分钟前
Rust+Slint 实现FTP客户端调试助手源码分享
开发语言·后端·rust
外收内放3 分钟前
面向对象高级(实战案例)
开发语言·python·学习
·present·39 分钟前
CSAPP(lecture 4_01)
c语言·c++
fanruitian1 小时前
python else用法
开发语言·python
FRing031 小时前
JavaScript入门到精通二十六(变量提升、函数剩余参数、展开运算符、ES6箭头函数)
开发语言·前端·javascript·es6·箭头函数
云深麋鹿1 小时前
C++ | 基于红黑树实现mymap与myset
开发语言·c++
weixin_417396832 小时前
桌面云终端PXE启动失败怎么排查?从DHCP Option到镜像下发
开发语言·前端·php·技术·酒店·综合布线·弱电
某不知名網友3 小时前
ROS2进阶:服务通信、自定义SRV接口、参数服务器与基于服务的参数通信详解
java·开发语言·microsoft
java_nnnn3 小时前
LeetCode刷题滑动窗口(水果成篮+找到字符串中所有字母的异位词)Java
java·开发语言·leetcode
qetfw3 小时前
Bash 字符串处理:参数展开、序列与脚本执行方式
linux·开发语言·chrome·bash