您的位置:首页 > 其它

CodeForce 526B Om Nom and Dark Park(dp + 递归)

2015-04-19 11:54 387 查看
Om Nom and Dark Park

time limit per test
1 second

memory limit per test
256 megabytes

input
standard input

output
standard output

Om Nom is the main character of a game "Cut the Rope". He is a bright little monster who likes visiting friends living at the other side of the park. However the dark old parks can scare even somebody as fearless as Om Nom, so he asks you to help him.



The park consists of 2n + 1 - 1 squares
connected by roads so that the scheme of the park is a full binary tree of depth n. More formally, the entrance to the park is located at the square 1.
The exits out of the park are located at squares 2n, 2n + 1, ..., 2n + 1 - 1 and
these exits lead straight to the Om Nom friends' houses. From each square i (2 ≤ i < 2n + 1)
there is a road to the square

.
Thus, it is possible to go from the park entrance to each of the exits by walking along exactly n roads.



To light the path roads in the evening, the park keeper installed street lights along each road. The road that leads from square i to square

has ai lights.

Om Nom loves counting lights on the way to his friend. Om Nom is afraid of spiders who live in the park, so he doesn't like to walk along roads that are not enough lit. What he wants is that the way to any of his friends should have in total the same number
of lights. That will make him feel safe.

He asked you to help him install additional lights. Determine what minimum number of lights it is needed to additionally place on the park roads so that a path from the entrance to any exit of the park contains the same number of street lights. You may add
an arbitrary number of street lights to each of the roads.

Input

The first line contains integer n (1 ≤ n ≤ 10)
— the number of roads on the path from the entrance to any exit.

The next line contains 2n + 1 - 2 numbers a2, a3, ... a2n + 1 - 1 —
the initial numbers of street lights on each road of the park. Here ai is
the number of street lights on the road between squares i and

.
All numbers ai are
positive integers, not exceeding 100.

Output

Print the minimum number of street lights that we should add to the roads of the park to make Om Nom feel safe.

Sample test(s)

input
2
1 2 3 4 5 6


output
5


Note

Picture for the sample test. Green color denotes the additional street lights.



题意:给出一棵满2叉树,深度为n,每条边有一个权值,可以对这些权值加上一个正整数吗,问最小需要加多少可以使从根节点到所有叶子结点的路径上的权值之和都相等。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

const int MaxN = 5000;
int dp[MaxN]; // dp[i]表示从第i个结点到出口共有多少个路灯
int a[MaxN]; // a[i]表示连接结点i/2和结点i的路上有多少个路灯
int m, n;
int ans;

int dfs(int x) {
    if(x >= m) return 0;
    dp[x * 2] = dfs(x * 2);
    dp[x * 2 + 1] = dfs(x * 2 + 1);
    dp[x] = max(dp[x * 2] + a[x * 2], dp[x * 2 + 1] + a[x * 2 + 1]);
    ans += (dp[x] - a[x * 2] - dp[x * 2]) + (dp[x] - a[x * 2 + 1] - dp[x * 2 + 1]);
    return dp[x];
}

int main() {
    while(~scanf("%d", &n)) {
        memset(dp, 0, sizeof(dp));
        m = (int)pow(2, n + 1);
        for(int i = 2; i <= m - 1; i++)
            scanf("%d", &a[i]);
        int p = dfs(1);
        printf("%d\n", ans);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: