1. 程式人生 > >5573 Binary Tree 構造

5573 Binary Tree 構造

題意:給出一顆二叉樹,根節點為1,子節點為父節點的2倍和2倍+1,從根節點開始依次向下走k層,問如何走能使得將路徑上的數進行加減最終結果得到n。

做題一定要注意資料範圍!  n <= 2^k啊!

是真的沒想到利用差值去搞事情。。

程式碼:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
    int T, kase = 1;
    ll n, k;
    cin >> T;
    while(T--)
    {
        cin >> n >> k;
        bool flag = 0;
        ll all =  (1ll << k) - 1, delta;
        delta = all - n;
        if(delta & 1){
            delta++;//這裡相當於多減去了1,要在最後一層加回來
            flag = 1;
        }
        delta >>= 1;
        printf("Case #%d: \n", kase++);
        for(int i = 0; i < k - 1; i++){
            if(delta >> i & 1) printf("%lld -\n", 1ll << i);
            else printf("%lld +\n", 1ll << i);
        }
        if(flag) printf("%lld +\n", (1ll << (k - 1)) + 1);
        else printf("%lld +\n", 1ll << (k - 1));
    }
}