热心的牛牛题解
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);
}
};