题目链接:传送门

题目大意:给你一棵树,根节点为1,树上每一个节点都有一个花费值和收入值(花费值>=收入值),要访问一个节点需先支付花费值,访问该节点结束后得到收入值

     同时访问树时要求是有序的,即访问一个节点后,需要访问完它所有的子节点,才能访问它的兄弟节点。问我们最少需要带多少钱就能访问完所有的节点。

题目思路:感觉是一道比较有趣的题,首先我们可以由题意知,访问完整个树付出的代价是一定的(总花费-总收入),设代价为 X,访问完后我们会得到总收入 Y,

     由题意可知访问完后我们手上的钱数 Y>=0,我们带的钱要尽可能少,那么Y就要尽可能小,我们要把每个节点返回的钱尽可能花出去,而不是留在手上。

     那么只需要dfs一遍,处理子节点的访问顺序,返回每个节点访问完后得到的最优情况(对每个节点都按带钱最少考虑)。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <cstring>
  7. #include <stack>
  8. #include <cctype>
  9. #include <queue>
  10. #include <string>
  11. #include <vector>
  12. #include<functional>
  13. #include <set>
  14. #include <map>
  15. #include <climits>
  16. #define lson root<<1,l,mid
  17. #define rson root<<1|1,mid+1,r
  18. #define fi first
  19. #define se second
  20. #define ping(x,y) ((x-y)*(x-y))
  21. #define mst(x,y) memset(x,y,sizeof(x))
  22. #define mcp(x,y) memcpy(x,y,sizeof(y))
  23. using namespace std;
  24. #define gamma 0.5772156649015328606065120
  25. #define MOD 1000000007
  26. #define inf 0x3f3f3f3f
  27. #define N 100005
  28. #define maxn 10005
  29. typedef pair<int,int> PII;
  30. typedef long long LL;
  31.  
  32. int n,m;
  33. int a[],b[];
  34. vector<int>V[];
  35. struct Node{
  36. int x,v; ///x花费值,v收入值
  37. bool operator<(const Node&a)const{
  38. return v>a.v;
  39. }
  40. };
  41. Node dfs1(int x,int fa){
  42. Node t1;
  43. vector<Node>v;
  44. for(int u:V[x]){
  45. if(u==fa)continue;
  46. t1=dfs1(u,x);
  47. v.push_back(t1);
  48. }
  49. sort(v.begin(),v.end()); ///按收入从大到小排序
  50. int temp1=a[x],temp2=b[x]; ///temp1花费,temp2收入,要访问当前节点需要花费a[x],访问当前节点后收入b[x]
  51. for(Node u:v){
  52. temp2-=u.x;
  53. if(temp2<){      ///如果当前收入不够支付下一个节点的花费,则需要多带钱
  54. temp1-=temp2;
  55. temp2=;
  56. }
  57. temp2+=u.v;
  58. }
  59. t1.x=temp1;t1.v=temp2;
  60. return t1;
  61. }
  62. int main() {
  63. int i,j,group,x,y,Case=;
  64. while(scanf("%d",&n)!=EOF){
  65. for(i=;i<=n;++i) scanf("%d%d",&a[i],&b[i]);
  66. for(i=;i<n;++i){
  67. scanf("%d%d",&x,&y);
  68. V[x].push_back(y);
  69. V[y].push_back(x);
  70. }
  71. Node node=dfs1(,-);
  72. printf("%d\n",node.x);
  73. }
  74. return ;
  75. }

hiho一下第109周《Tower Defense Game》的更多相关文章

  1. hdu 4779 Tower Defense (思维+组合数学)

    Tower Defense Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) ...

  2. HDU 4779:Tower Defense

    Tower Defense Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)T ...

  3. dp --- hdu 4939 : Stupid Tower Defense

    Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/ ...

  4. hdu4939 Stupid Tower Defense (DP)

    2014多校7 第二水的题 4939 Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131 ...

  5. 圆内,求离圆心最远的整数点 hiho一下第111周 Farthest Point

    // 圆内,求离圆心最远的整数点 hiho一下第111周 Farthest Point // 思路:直接暴力绝对T // 先确定x范围,每个x范围内,离圆心最远的点一定是y轴两端的点.枚举x的范围,再 ...

  6. Stupid Tower Defense

    Problem Description FSF is addicted to a stupid tower defense game. The goal of tower defense games ...

  7. 初识Tower Defense Toolkit

    Tower Defense Toolkit 做塔防游戏的插件 主要层次如下图: 1GameControl _ _Game Control(Script) _ _ _Spawn Manager _ _ ...

  8. HDU4939Stupid Tower Defense (有思想的dp)

    Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Oth ...

  9. Tower Defense Game

    Tower Defense Game 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 There is a tower defense game with n level ...

随机推荐

  1. PHP-PHP5.3及以上版本中检查json格式的方法

    function is_json($string) { json_decode($string); return (json_last_error() == JSON_ERROR_NONE); } j ...

  2. jBoss修改端口号

    http://blog.csdn.net/ghost_t/article/details/5708991 jBoss版本: jboss-5.1.0.GA jboss-6.0.0.Final     j ...

  3. php json_decode失败,返回null

    在使用json_decode之前,一定得保证字符串是utf-8编码,而执行json_decode失败的原因有很多,罗列如下: 1)编码不对: 2)字符串格式不对: 3)字符串格式对,但是有异常字符: ...

  4. 关于ie,火狐,谷歌浏览器滚动条的隐藏以及自定义样式

    最近做了一个项目,要求各个浏览器统一滚动条的样式,不显示滚动条,但是不影响鼠标的滑动事件. 查了很多资料,ie和谷歌都是可以自定义滚动条样式的,但是ie只能改变颜色,并不能修改宽度,圆角之类的.谷歌就 ...

  5. JS JSOP跨域请求实例详解

    JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题.这篇文章主要介绍了JS JSOP跨域请求实例详解的相关资料,需要的朋友可以参考下 ...

  6. poj_2773

    题目的愿意非常easy.给你一个n,求在升序排列的情况下,第k个与之相互素的数. 解法:首先我们要知道gcd(b×t+a,b)=gcd(a.b),那么接下来就非常easy了.全部与之互素的数都是以ph ...

  7. HTTP Cache怎样计算Age

    这里的Age指的是响应头Age.以下内容有部分翻译,也有部分自己的理解.欢迎讨论. 我们用now表示当前主机的当前时间,用request_time表示缓存发起请求的时间,用response_time表 ...

  8. SQL变量与全局变量

    变量 1.局部变量的声明(一个@) declare @n int   --声明变量关键字为declare 然后@加变量名 后面是变量类型 declare @s varchar(36) 2.局部变量的赋 ...

  9. 点滴积累【JS】---JQuery实现条形统计图,适用于选择题等统计

    效果: 思路:前台JS实现动态数据效果,后台可以拼接字符串或者用JSON加载数据 代码: <%@ Page Language="C#" AutoEventWireup=&qu ...

  10. 让 Vivado有Zybo Board的配置文件

    Zybo Board开发记录: 让 Vivado有Zybo Board的配置文件 由 judyzhong 于 星期三, 07/13/2016 - 10:41 发表 本文转载自:coldnew's bl ...