タイトルリンク:https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id = 1374
トピック
忍者シャドウクローン。忍者にはn点チャクラがあります。チャクラの数が1を超えると、シャドウクローンを作成し、ファントムを作成し、それらをai点チャクラに分割して、2点チャクラを残し、同時に体の疲労値を増加させることができます| 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;
}