小度的特种部队一共有n名士兵, 一天小度派所有士兵去探索野区。士兵们出发时沿着一条道路行进, 直到遇到三岔路口。
小度在出发前就给部队部署了部队划分规则: 当遇到三岔路口的时候, 部队若可以分为两个部分,并且两个部分的人数差恰好为k, 那么就完成部队划分, 划分的两个部分分别沿着两条路行进下去,否则该部队的所有士兵就在此位置停下扎营。
野区内有不计其数的三岔路口, 所以整个部队的每一个部分最终都会停下扎营,小度想知道最终扎营的总数为多少?
包括两个整数, 即部队中士兵的总人数和划分部队的参数。
一个整数,表示最终答案。
10 2
5
10
/ \
6 4
/\ /\
4 2 3 1
/\
3 1
最终叶子节点个数即答案:5
var lines = readline().split(" ") var n = parseInt(lines[0]) var k = parseInt(lines[1]) var count = 0 function result(n,k){ if(n<=k||(n-k)%2){ //不能划分的话记录count次数+1 return count+=1 }else{ var a = result((n+k)/2,k) var b = result((n-k)/2,k) } } result(n,k) console.log(count)JS代码简单明了
import java.util.Scanner; public class Main { static int count = 0; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int k = sc.nextInt(); recur(n, k); System.out.println(count); } private static void recur(int n, int k) { if (n <= 0 || (n - k) % 2 != 0 || n <= k) { count++; return; } // x + (x + k) = n ==> x = (n - k) / 2 int x = (n - k) / 2; recur(x, k); recur(x + k, k); } }
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { static int res=0; public static void main(String[] args) { Scanner in = new Scanner(System.in); int a = in.nextInt(); int b = in.nextInt(); f(a,b); System.out.println(res+1); } public static void f(int count,int k){ if(count<=k+1){ return; }else{ if((count-k)%2==0){ res++; int left=(count-k)/2; int right=left+k; f(left,k); f(right,k); } } } }
import java.util.Scanner; import java.lang.Math; public class Main{ public static void main(String[] args) { Scanner scan = new Scanner(System.in); int n = scan.nextInt(); int m = scan.nextInt(); System.out.println(solve(n, m)); } public static int solve(int n, int m) { if (n <= m || (n - m) % 2 != 0) return 1; int avg = (n - m) / 2; int left = avg + m; int right = avg; return solve(left, m) + solve(right, m); } }
public class Main { private static int ans = 0; public static void dfs(int sum, int k) { if (sum < k + 2 || sum < k || (sum - k) % 2 != 0) { ans += 1; return; } dfs((sum - k) / 2, k); dfs((sum - k) / 2 + k, k); } public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int k = in.nextInt(); dfs(n, k); System.out.println(ans); } }
import java.util.Scanner; public class Main{ public static int num = 0; public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int k = sc.nextInt(); if(n<=k){ System.out.println(1); }else{ count(n,k); } System.out.println(num); } public static boolean isValid(int n,int k){ if(n<=k) return false; if((n+k)%2==0) return true; return false; } public static void count(int n,int k){ int x = 0; int y = 0; if(isValid(n,k)){ x = (n+k)/2; y = n-x; //System.out.println("有效分解...."+x+" "+y); count(x,k); count(y,k); }else{ num++; return; } } }
function prepost(n,k){ let a=(n+k)/2; let b=(n-k)/2; if(a%1!=0||b%1!=0||a<=0||b<=0){ res=res+1; return(res); }else{ prepost(a,k); prepost(b,k); return res;} } var lines=readline().split(' '); var n=lines[0]; var k=lines[1]; var res=0; prepost(n,k); console.log(res);
n, k = [int(v) for v in input().split()] def separate(n, k): tmp = n-k if tmp > 0 and tmp%2 == 0: tmp_2 = tmp//2 return separate(tmp_2+k, k) + separate(tmp_2, k) else: return 1 print(separate(n, k))递归
#include<bits/stdc++.h> using namespace std; unordered_map<int, int> M; int calc(int n, int k) { if (n <= k || (n - k) % 2) return 1; // 不可再划分 if (M.count(n)) return M[n]; int res = calc((n - k) / 2, k) + calc((n + k) / 2, k); M[n] = res; return res; } int main() { int n, k; cin >> n >> k; cout << calc(n, k) << endl; return 0; }