250pt:
一水...
500pt:
题意:
给你一颗满二叉树的高度,然后找出出最少的不想交的路径并且该路径每个节点只经过一次。
思路:
观察题目中给的图就会发现,其实每形成一个
就会存在一条路径。
我们只要求该满二叉树一共包含多少个即可。
注意奇数与偶数的不同,偶数要忽略第一个根节点,然后后边在+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; } };