zcmu1374: Greatest Naruto Army(递归)

题目链接:https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1374

题目大意

忍者影分身。忍者有n点脉轮,当脉轮数量超过1的时候可以进行影分身,制造幻象,并且分他ai点脉轮,剩下bi点脉轮,同时主体疲劳值增加|ai-bi|,幻象和主体还能继续影分身,直到脉轮数等于1。问在幻象最多的情况下使得疲劳值最小,求这个最小疲劳值。

范围:(0 < N < 1e7)

思路

dfs递归求解。首先他一共有n-1个幻象这个毋庸置疑,那么现在就要降低疲劳值,那么就是减小|ai-bi|,那么当n是偶数时使得ai等于n/2即可使得疲劳值加0,当n是奇数是,使得ai等于n/2,但是疲劳值加1。由于幻象也可以继续分身,那么就可以递归求解。

ac代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int dfs(int n){
    if(n <= 2) return 0;
    if(n % 2 == 0) return dfs(n / 2) + dfs(n / 2);
    else return dfs(n / 2) + dfs(n / 2 + 1) + 1;
}
int main(){
    int t; scanf("%d", &t);
    while(t --){
        int n; scanf("%d", &n);
        printf("%d\n", dfs(n));
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43911947/article/details/113405763