ZeptoLab Code Rush 2015_B - Om Nom and Dark Park

B - Om Nom and Dark Park
Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u

Description

Om Nom 是一个游戏“Cut the Rope”中的主要角色,他是一个聪明的小怪兽,他非常喜欢去访问公园里其他地方的朋友。然而,到了晚上,昏暗的灯光让他非常害怕,现在他请你来帮助他。

这个公园里有 2^(n + 1) - 1 个地方,部分地方之间有路相连接,这个形状是一颗深度为n的完全二叉树。整个公园的入口在位置1,出口在位置2^n, 2^n + 1, ..., 2^(n + 1) - 1,出口都是通向Om Nom朋友家里的。对任何位置i(2 ≤ i < 2^(n + 1),都有一条路通向位置i div 2,因此,从入口位置1出发,只要经过n条道路,就可以到达出口。

为了在夜晚照亮道路,公园的管理者决定在道路上安装路灯。位置i到位置i div 2的道路上有  ai   个路灯。
Om Nom喜欢统计路上的路灯数量,他非常害怕公园里的蜘蛛,因为他决定不走那些他认为不够亮的道路。他想要使得他到朋友家的任何一条路径上的路灯总数都是一样的。
现在,请你在某些道路上添加最少的路灯,使得从位置1出发到任何出口的路径上的路灯数量都是相等的。

Input

输入第一行为n,表示树的深度。(1<=n<=10)。
接下来一行2^(n+1)-2个非负整数,分别表示a2,a3,a4..a2^(n+1)-1,表示初始的时候在每条路上的路灯数量。ai表示的是位置i到位置i div 2之间的路灯数量。所有ai不超过整数100。

Output

输出最少需要添加的路灯的数量,才能使得Om Nom感觉安全。

Sample Input

2
1 2 3 4 5 6

Sample Output

5

Hint

下图是样例的解释,绿色的代表添加的路灯。

思路:从底层开始,父亲的值为左右孩子的min,ans+左右孩子-父亲的值就是结果


代码
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <string>
#include <cmath>
#include <set>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std;
#define esp  1e-8
const double PI = acos(-1.0);
const int inf = 1000000005;
const long long mod = 1000000007;
//freopen("in.txt","r",stdin); //输入重定向,输入数据将从in.txt文件中读取
//freopen("out.txt","w",stdout); //输出重定向,输出数据将保存在out.txt文件中






int main(){
int n;
int num[5000];
int sum[5000];
int base;
scanf("%d", &n);
base = 1;
for(int i = 1; i <= n; i++)
base*=2;
sum[0] = 0;
int _max;
for(int i = 2; i <= base*2-1; i++){
scanf("%d",&num[i]);
sum[i] = sum[i/2]+num[i];
_max = max(_max,sum[i]); 
}
for(int i = base; i <= base*2-1; i++){
sum[i] = _max-sum[i];
}
int ans = 0;
while(base > 1){
for(int i = base ; i < base*2; i+=2){
sum[i/2] = min(sum[i],sum[i+1]);
ans+=sum[i]-sum[i/2];
ans+=sum[i+1]-sum[i/2];
}
base/=2;
}
printf("%d\n",ans);
return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值