题目链接:

http://codeforces.com/problemset/problem/77/C

C. Beavermuncher-0xFF

time limit per test:3 seconds
memory limit per test:256 megabytes
#### 问题描述
> "Eat a beaver, save a tree!" — That will be the motto of ecologists' urgent meeting in Beaverley Hills.
>
> And the whole point is that the population of beavers on the Earth has reached incredible sizes! Each day their number increases in several times and they don't even realize how much their unhealthy obsession with trees harms the nature and the humankind. The amount of oxygen in the atmosphere has dropped to 17 per cent and, as the best minds of the world think, that is not the end.
>
> In the middle of the 50-s of the previous century a group of soviet scientists succeed in foreseeing the situation with beavers and worked out a secret technology to clean territory. The technology bears a mysterious title "Beavermuncher-0xFF". Now the fate of the planet lies on the fragile shoulders of a small group of people who has dedicated their lives to science.
>
> The prototype is ready, you now need to urgently carry out its experiments in practice.
>
> You are given a tree, completely occupied by beavers. A tree is a connected undirected graph without cycles. The tree consists of n vertices, the i-th vertex contains ki beavers.
>
> "Beavermuncher-0xFF" works by the following principle: being at some vertex u, it can go to the vertex v, if they are connected by an edge, and eat exactly one beaver located at the vertex v. It is impossible to move to the vertex v if there are no beavers left in v. "Beavermuncher-0xFF" cannot just stand at some vertex and eat beavers in it. "Beavermuncher-0xFF" must move without stops.
>
> Why does the "Beavermuncher-0xFF" works like this? Because the developers have not provided place for the battery in it and eating beavers is necessary for converting their mass into pure energy.
>
> It is guaranteed that the beavers will be shocked by what is happening, which is why they will not be able to move from a vertex of the tree to another one. As for the "Beavermuncher-0xFF", it can move along each edge in both directions while conditions described above are fulfilled.
>
> The root of the tree is located at the vertex s. This means that the "Beavermuncher-0xFF" begins its mission at the vertex s and it must return there at the end of experiment, because no one is going to take it down from a high place.
>
> Determine the maximum number of beavers "Beavermuncher-0xFF" can eat and return to the starting vertex.
#### 输入
> The first line contains integer n — the number of vertices in the tree (1 ≤ n ≤ 105). The second line contains n integers ki (1 ≤ ki ≤ 105) — amounts of beavers on corresponding vertices. Following n - 1 lines describe the tree. Each line contains two integers separated by space. These integers represent two vertices connected by an edge. Vertices are numbered from 1 to n. The last line contains integer s — the number of the starting vertex (1 ≤ s ≤ n).
#### 输出
> Print the maximum number of beavers munched by the "Beavermuncher-0xFF".
>
> Please, do not use %lld specificator to write 64-bit integers in C++. It is preferred to use cout (also you may use %I64d).
#### 样例
> **sample input**
> 5
> 1 3 1 3 2
> 2 5
> 3 4
> 4 5
> 1 5
> 4
>
> **sample output**
> 6

题意

给你一颗树,树上每个点有ai个小球,现在你有一个机器人位于根节点,这个机器人每走到一个节点,就会吃掉这个节点上的一个小球(初始位置一开始不会吃),如果一个位置没有小球,这个机器人是过不去的,而且这个机器人不会停下来,现在问你从根节点开始吃,最后要求能回到根节点,能吃到的最多小球。

题解

贪心:

策略1:从u进入一个子节点v的时候,优先考虑吃掉v的子树,再考虑u,v之间来回吃。

策略2:对于u的所有子节点vi,定义sumv[vi]为吃掉最多的以vi为根的子树的球(并且回到vi)。那么我们对于u,优先考虑先吃sumv[vi]比较大的子树。

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std; const int maxn=1e5+10;
typedef __int64 LL; //cntv[v]:表示v节点的小球个数
//sumv[v]:表示吃完以v为根的子树并回到v能吃到的最多小球。
//remv[v]:表示吃完以v为根的子树并回到v能吃到的最多小球之后,v这个节点还剩下的小球个数。
LL cntv[maxn],sumv[maxn],remv[maxn];
int n,rt; void init(){
memset(remv,0,sizeof(remv));
memset(sumv,0,sizeof(sumv));
} vector<int> G[maxn];
void dfs(int u,int fa){
if(G[u].size()==1&&fa!=-1){
remv[u]=cntv[u];
sumv[u]=0;
}else{
priority_queue<LL> pq;
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(v==fa) continue;
dfs(v,u);
pq.push(sumv[v]);
}
if(fa!=-1){
sumv[u]++; cntv[u]--;
}
while(cntv[u]&&!pq.empty()&&pq.top()){
LL t=pq.top(); pq.pop();
sumv[u]+=t;
cntv[u]--;
sumv[u]++;
}
for(int i=0;i<G[u].size()&&cntv[u];i++){
int v=G[u][i];
if(v==fa) continue;
if(remv[v]==0) continue;
if(cntv[u]>=remv[v]){
sumv[u]+=2*remv[v];
cntv[u]-=remv[v];
}else{
sumv[u]+=2*cntv[u];
cntv[u]=0;
}
}
remv[u]=cntv[u];
}
} int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&cntv[i]);
}
for(int i=1;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
scanf("%d",&rt);
dfs(rt,-1);
printf("%I64d\n",sumv[rt]);
return 0;
} /*
5
1 1 1 1 1
2 5
3 4
4 5
1 5
4 6
3 3 1 2 3 5
2 6
1 6
4 5
5 1
3 4
5
*/

Codeforces Beta Round #69 (Div. 1 Only) C. Beavermuncher-0xFF 树上贪心的更多相关文章

  1. Codeforces Beta Round #69 (Div. 2 Only)

    Codeforces Beta Round #69 (Div. 2 Only) http://codeforces.com/contest/80 A #include<bits/stdc++.h ...

  2. Codeforces Beta Round #85 (Div. 1 Only) A. Petya and Inequiations 贪心

    A. Petya and Inequiations Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest ...

  3. Codeforces Beta Round #63 (Div. 2)

    Codeforces Beta Round #63 (Div. 2) http://codeforces.com/contest/69 A #include<bits/stdc++.h> ...

  4. Codeforces Beta Round #80 (Div. 2 Only)【ABCD】

    Codeforces Beta Round #80 (Div. 2 Only) A Blackjack1 题意 一共52张扑克,A代表1或者11,2-10表示自己的数字,其他都表示10 现在你已经有一 ...

  5. Codeforces Beta Round #83 (Div. 1 Only)题解【ABCD】

    Codeforces Beta Round #83 (Div. 1 Only) A. Dorm Water Supply 题意 给你一个n点m边的图,保证每个点的入度和出度最多为1 如果这个点入度为0 ...

  6. Codeforces Beta Round #79 (Div. 2 Only)

    Codeforces Beta Round #79 (Div. 2 Only) http://codeforces.com/contest/102 A #include<bits/stdc++. ...

  7. Codeforces Beta Round #77 (Div. 2 Only)

    Codeforces Beta Round #77 (Div. 2 Only) http://codeforces.com/contest/96 A #include<bits/stdc++.h ...

  8. Codeforces Beta Round #76 (Div. 2 Only)

    Codeforces Beta Round #76 (Div. 2 Only) http://codeforces.com/contest/94 A #include<bits/stdc++.h ...

  9. Codeforces Beta Round #75 (Div. 2 Only)

    Codeforces Beta Round #75 (Div. 2 Only) http://codeforces.com/contest/92 A #include<iostream> ...

随机推荐

  1. (四)、 nodejs中Async详解之一:流程控制

    为了适应异步编程,减少回调的嵌套,我尝试了很多库.最终觉得还是async最靠谱. 地址:https://github.com/caolan/async Async的内容分为三部分: 流程控制:简化十种 ...

  2. eMarketer:DMP帮广告主搞定大数据处理问题

    DMP(数据管理平台)帮助广告主获得可行动的洞察 在数字广告领域,大数据和数据管理平台(DPMs)仍大有可为.DMPs让广告主可以使用他们的大数据来做出更灵活更有效的营销决策. 数据管理和分析是业界挑 ...

  3. 多端口站点设置,以APMSERV集成环境为例!

    以下以APMSERV集成环境为例: 1.找到你的apache上的配置文件httpd.conf,用记事本打开, D:\APMServ\Apache\conf 2.修改以下几项: Listen 80 下增 ...

  4. 3)Java容器

    3)Java容器   Java的集合框架核心主要有三种:List.Set和Map.这里的 Collection.List.Set和Map都是接口(Interface). List lst = new ...

  5. STM32F0xx_SPI读写(Flash)配置详细过程

    Ⅰ.概述 关于SPI(Serial Peripheral Interface)串行外设接口可以说是单片机或者嵌入式软件开发人员必须掌握的一项通信方式,就是你在面试相关工作的时候都可能会问及这个问题.在 ...

  6. 一些关于python的小感想

    python是一门优秀的语言,但随之而来的是大量的知识,各种模块,相信一个人的大脑是很难记住如此多的内容.这时后的我们就应该想办法避免去记忆这么多的内容. 1.查看官方文档(英语很重要,啥也不说了) ...

  7. Python 初学(一) 标识符

    Python 标识符 在python里,标识符由字母.数字.下划线组成: python中的标识符是区分大小写的: 1)以单下划线开头(_foo)的代表不能直接访问的类属性,需要通过类提供的接口进行访问 ...

  8. IO - 同步,异步,阻塞,非阻塞 (转)

    转自:http://blog.csdn.net/historyasamirror/article/details/5778378 向大牛学习,言归正传.同步(synchronous) IO和异步(as ...

  9. oh-my-zsh配置你的zsh提高shell逼格终极选择

    抱歉,这篇博文推迟发布了,人都是有惰性的...看在这个牛逼闪闪的标题就原谅我吧! 为何这篇文章要归类到 mac 下? 第一个问题,稍后我们说明下. zsh是个什么东东? 第二个问题... 你应该稍微接 ...

  10. golang实现ping命令

    // Copyright 2009 The Go Authors.  All rights reserved.// Use of this source code is governed by a B ...