生活所迫

题目描述

“别人总说我瓜,其实我一点也不瓜,大多数时候我都机智的一批“
没想到我宝儿姐也有生活所迫的时候,还好我技多不压身,做了一名优秀的混凝土搬运师。
可是,我发现我有强迫症,我非得把一堆n块砖块分成n堆每堆一块儿的才舒服。可是我不知道这样做需要我
花费多少力气。我可以确定的是,我每次尽可能地把一堆砖块均分成两堆,如果能均分,我需要付出1点体力,如果不能
均分,需要我花费2点体力。比如,我把一堆6块砖分成两堆3块的,就花费我1点体力;如果我把一堆11块砖的分成一堆
5块和一堆6块的,需要花费我2点体力。聪明的你请帮我算算,我把这1堆n块砖分成n堆1块砖需要花费多少体力呢?
 

输入

多实例测试。
第一行一个case,代表测试实例(T<=5)
第二行一个n,代表一堆n块的砖。(n<=1e5)

输出

每组样例输出一个答案,代表宝儿姐需要花费的体力,占一行。

样例输入

1
7

样例输出

8

直接递归求解:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<string>
#include<set>
#include<vector>
#define ll long long
using namespace std;
const ll MAXN=50010;
ll a,b,c,d,sum;
ll fab(ll c){
    if(c==1) return 0;
    else if(c==2) return 1;
    else if(c>2&&c%2==1){
        return 2+fab(c/2)+fab(c-c/2);
    }
    else if(c>2&&c%2==0){
        return 1+fab(c/2)+fab(c-c/2);//递归关系
    }
}
int main(){
    scanf("%lld",&a);
    for(int i=0;i<a;i++){
        scanf("%lld",&b);
        c=fab(b);
        printf("%lld\n",c);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/liubang00001/article/details/81487679
今日推荐