题目在这里
题意比较难理解,因为里面有好多我不认识的单词,比如Santa Claus ,比如tangerine …
简要大意大概是圣诞老人想要分橘子(圣诞老人为啥要分橘子啊),橘子可以对半分,对半分之后也要对半分,如果橘子瓣是个odd,就要分成odd/2和odd/2+1两部分。然后有k个人,要想每个人都有橘子,求每个人分的橘子数目最小值的最大值。(每个人只能分一次橘子,不可以重复得到)。
首先,这个题目的问法又很二分,我们要求最小值的最大值,显然是二分答案。
具体怎么二分呢,dfs(a[i],x)表示目前这a[i]瓣橘子可以分成最小的是x瓣最多可以分给几个人。
我们的dfs如下,大家应该一看就能理解了:
long long dfs(int v,int x)
{
if(v<x) return 0;
if(vis[v]) return vis[v];
if(v/2<x) return vis[v] = 1;
if(v&1)
{
return vis[v] += dfs(v/2+1,x)+dfs(v/2,x);
}
else return vis[v] = 2*dfs(v/2,x);
}
然后鉴于有很多重复操作,我们将它改成记忆化就完事了。
check在这里,很简单吧。(为了降低复杂度,先将a按从大到小排序)。
bool check(int x)
{
long long ans = 0;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
if(a[i]<x) break;
ans += dfs(a[i],x);
}
return ans>=m;
}