250pt:

一水...

500pt:
题意:

给你一颗满二叉树的高度,然后找出出最少的不想交的路径并且该路径每个节点只经过一次。

思路:
观察题目中给的图就会发现,其实每形成一个

SRM 585 DIV2

就会存在一条路径。

我们只要求该满二叉树一共包含多少个即可。

注意奇数与偶数的不同,偶数要忽略第一个根节点,然后后边在+1

#include <iostream> 
#include <cstdio> 
#include <cmath> 
#include <vector> 
#include <cstring> 
#include <algorithm> 
#include <string> 
#include <set> 
#include <functional> 
#include <numeric> 
#include <sstream> 
#include <stack> 
#include <map> 
#include <queue> 

#define CL(arr, val)    memset(arr, val, sizeof(arr)) 

#define lc l,m,rt<<1 
#define rc m + 1,r,rt<<1|1 
#define pi acos(-1.0) 
#define ll long long 
#define L(x)    (x) << 1 
#define R(x)    (x) << 1 | 1 
#define MID(l, r)   (l + r) >> 1 
#define Min(x, y)   (x) < (y) ? (x) : (y) 
#define Max(x, y)   (x) < (y) ? (y) : (x) 
#define E(x)        (1 << (x)) 
#define iabs(x)     (x) < 0 ? -(x) : (x) 
#define OUT(x)  printf("%I64d\n", x) 
#define lowbit(x)   (x)&(-x) 
#define Read()  freopen("din.txt", "r", stdin) 
#define Write() freopen("dout.txt", "w", stdout); 


#define M 5007 
#define N 1007 
using namespace std; 


ll pow2[N]; 
void init() 
{ 
    for (int i = 0; i <= 63; ++i) 
    { 
        pow2[i] = (1LL<<i); 
    } 
} 
class TrafficCongestionDivTwo 
{ 
        public: 
        long long theMinCars(int n) 
        { 
            init(); 
            ll ans = 0; 
            if (n % 2 == 1) //奇数
            { 
                for (int i = 0; i < n; ++i) 
                { 
                    if (i%2 == 0) ans += pow2[i]; 
                } 
            } 
            else //偶数
            { 

                ans = 1LL; 
                for (int i = 1; i < n; ++i) 
                { 
                    if (i%2 == 1) 
                    { 
                        ans += pow2[i]; 
                    } 
                } 
            } 
            return ans; 
        } 


}; 
View Code

相关文章: