Live2d Test Env

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;
}

 

posted @ 2017-12-27 17:17  nimphy  阅读(184)  评论(0编辑  收藏  举报