HihoCoder1650 : 扁平化管理([Offer收割]编程练习赛38)(二分)
描述
小Hi的公司包括CEO在内一共有N名员工。这N名员工的上下级关系形成树形结构,CEO处于树根,普通员工处于叶子节点。
现在公司希望管理扁平化,要求树形结构中的层级不超过L层。此外,假设A是B的直接上级,那么B管理的下属数目必须少于A管理的下属数目。
请你判断CEO至少要管理多少名下属?
例如N=12,L=3则CEO至少要管理4名下属。因为假设CEO只管理3名下属,则整个公司最多容纳10名员工,如下图所示:
1 / | \ 2 3 4 / \ / \ / \ 5 6 7 8 9 10
输入
两个整数N和L。 (2 ≤ N, L ≤ 1018)
输出
一个整数代表答案。
样例输入
12 3
样例输出
4
。。没敢写二分。。。结果数据这么水。。。所以直接借的别人代码,此题意义不大。
#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; ll N,L,l,r,mid,sum,tmp,t; int main() { scanf("%lld%lld",&N,&L); if(L==2){ printf("%lld\n", N-1); return 0; } l=1;r=N; while(l<r){ mid=(l+r)>>1; sum=1,tmp=1,t=max(mid-L+2,(ll)1); for(ll i=mid;i>=t;i--){ if(N/i<=tmp||sum>=N){ sum=N; break; } tmp*=i; sum+=tmp; } if(sum>=N) r=mid; else l=mid+1; } printf("%lld\n",l); return 0; }
It is your time to fight!