热心的牛牛题解

30分解法

由于k最大范围是100,所以只需要从0向上遍历即可,假设牛牛有x块糖果,他的n个朋友每个至少有x+1块糖果,所以只要在遍历过程中遇到,说明此时糖果不够了,跳出循环输出即可。最多遍历k次,所以时间复杂度o(k),空间复杂度o(1)

100分解法

这里介绍两种做法

解法一:二分,时间复杂度o(logk),空间复杂度o(1)

思想和30分解法相同,同时我们不难发现这个问题是单调的,所以我们只要令l=0,r=k每次二分判断就能得到我们想要的答案。但是二分时有一个比较坑的易错点,就是n*(x+1)会爆long long。这里可以用__int128判断一下他们的乘积,当然这个问题也可以通过修改二分范围规避。因为二分上界实际到不了k,由于一共n+1个人,即使牛牛可以拥有和他人一样的糖数,他最多也只能拥有k/(n+1)个糖果,所以把二分上界调为k/(n+1)同样可以规避这个问题。下面是代码:

class Solution {
public:
    /**
     * 返回牛牛能吃到的最多糖果数
     * @param n long长整型 
     * @param k long长整型 
     * @return long长整型
     */
    long long Maximumcandies(long long n, long long k) {
        // write code here
        long long l=0,r=k/(n+1),mid,pos;
        while(l<=r)
        {
            mid=(l+r)/2;
            if(n*(mid+1)+mid<=k)
               {
                   pos=mid;
                   l=mid+1;
               }
            else r=mid-1;
        }
        return pos;
    }
};

解法二:推公式,时间复杂度o(1),空间复杂度o(1)

其实推出公式牛牛获得的糖果x必须满足后,移项整理一下就可以得到,直接输出答案即可。下面是代码

class Solution {
public:
    /**
     * 返回牛牛能吃到的最多糖果数
     * @param n long长整型 
     * @param k long长整型 
     * @return long长整型
     */
    long long Maximumcandies(long long n, long long k) {
        // write code here
        return (k-n)/(n+1);
    }
};
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-07 13:15
点赞 评论 收藏
分享
06-18 13:28
已编辑
门头沟学院 Web前端
爱睡觉的冰箱哥:《给予你300的工资》,阴的没边了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务