b_nk_热心的牛牛 & 三角形(思维题:二分 | 斐波那契变形)
热心的牛牛
牛牛有k颗糖果,n位朋友,怎么分配才能让所有朋友都比自己多,且自己尽量多
思路:二分+贪心,自己尽量多,然后让朋友尽量不多于自己太多
typedef long long ll;
class Solution {
public:
ll Maximumcandies(ll n, ll k) {
ll l=0, r=k, ans=0;
while (l<=r) {
ll m=l+(r-l)/2;
if ((__int128)(m+1)*n+m<=k) ans=m, l=m+1; //一直错,直到找了下这个int类型...
else r=m-1;
}
return ans;
}
};
三角形
小明有一根长度为a的木棒,现在小明想将木棒分为多段,使得取出的任意三段都不能构成三角形,小明想知道木棒最多被分成几段?
- 不能构成三角形:两边a、b之和小于不小于第三边c
- 尽量让段数多,就是让a+b=c
typedef long long ll;
const int N=60;
class Solution {
public:
ll fac[N+5];
ll get(ll len) {
ll ans=0, s=0, i=0;
while(i<N) {
s+=fac[i];
if(s>len) break;
i++, ans++;
}
return ans;
}
int stick(ll a) {
fac[0]=1, fac[1]=1;
for (int i=2; i<N; i++) fac[i]=fac[i-2]+fac[i-1];
return get(a);
}
};