【牛客编程巅峰赛S2第2场 - 钻石&王者】牛牛切木棒(题解 && 代码)

题目描述

牛牛有一根长度为a(3≤a≤1e18)的木棒,现在牛牛想将木棒分成一些段(每段木棒长度必须为整数),使得分隔后的木棍中,任意三段都不能构成三角形,牛牛想知道木棒最多被分成几段呢?

实例

输入
5
输出
3

题目解析

这道题就是一道斐波那契数列的变种题,对于木棒怎么分割,我们只要考虑相邻的三个构不成三角形,其他方法也必然不能构成三角形。

上述样例5,按照斐波那契数列来说是1 1 2,
但是还剩下1,满足不了下一个数(3),
所以我们将剩余的1,加入到前一个2中,得到序列1 1 3既是答案。

AC代码

public static int stick (long a) {
        // write code here
        if(a == 3) {
            return 2;
        }
        if(a == 4) {
            return 3;
        }
        int ans = 2;
        a -= 2;
        long x1 = 1;
        long x2 = 1;
        while(true){
            long cur = x1+x2;
            if(a >= cur){
                a -= cur;
            } else {
                break;
            }
            ans++;
            if(a == 0) {
                break;
            }
            x1 = x2;
            x2 = cur;
        }
        return ans;
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值