hiho一下第109周《Tower Defense Game》

题目链接:传送门

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

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

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

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

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

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cctype>
#include <queue>
#include <string>
#include <vector>
#include<functional>
#include <set>
#include <map>
#include <climits>
#define lson root<<1,l,mid
#define rson root<<1|1,mid+1,r
#define fi first
#define se second
#define ping(x,y) ((x-y)*(x-y))
#define mst(x,y) memset(x,y,sizeof(x))
#define mcp(x,y) memcpy(x,y,sizeof(y))
using namespace std;
#define gamma 0.5772156649015328606065120
#define MOD 1000000007
#define inf 0x3f3f3f3f
#define N 100005
#define maxn 10005
typedef pair<int,int> PII;
typedef long long LL;

int n,m;
int a[10005],b[10005];
vector<int>V[10005];
struct Node{
    int x,v;    ///x花费值,v收入值
    bool operator<(const Node&a)const{
        return v>a.v;
    }
};
Node dfs1(int x,int fa){
    Node t1;
    vector<Node>v;
    for(int u:V[x]){
        if(u==fa)continue;
        t1=dfs1(u,x);
        v.push_back(t1);
    }
    sort(v.begin(),v.end());  ///按收入从大到小排序
    int temp1=a[x],temp2=b[x]; ///temp1花费,temp2收入,要访问当前节点需要花费a[x],访问当前节点后收入b[x]
    for(Node u:v){
        temp2-=u.x;
        if(temp2<0){       ///如果当前收入不够支付下一个节点的花费,则需要多带钱
            temp1-=temp2;
            temp2=0;
        }
        temp2+=u.v;
    }
    t1.x=temp1;t1.v=temp2;
    return t1;
}
int main() {
    int i,j,group,x,y,Case=0;
    while(scanf("%d",&n)!=EOF){
        for(i=1;i<=n;++i) scanf("%d%d",&a[i],&b[i]);
        for(i=1;i<n;++i){
            scanf("%d%d",&x,&y);
            V[x].push_back(y);
            V[y].push_back(x);
        }
        Node node=dfs1(1,-1);
        printf("%d\n",node.x);
    }
    return 0;
}
时间: 2024-07-31 13:26:38

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

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

Tower Defense Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total Submission(s): 474    Accepted Submission(s): 126 Problem Description DRD loves playing computer games, especially Tower Defense games. Tower De

Stupid Tower Defense

题目链接 题意: 水平方向上n个1*1的格子,每个格子内部可以种一个植物,经过一个格子的时间为t.一共三种植物:R植物,经过时每秒收到r点伤害:G植物,经过后每秒受到g点伤害:B植物,经过后经过一个格子的时间加上b 2<=n<=1500,0<=r, g, b<=60000,1<=t<=3 分析: 最开始考虑的贪心:先B植物,后G植物,最后B植物,后来才发现是错误的. 首先明白,R植物对答案的影响和位置无关,而B和G植物越早种越好,所以问题就在于B和G的种法上. 状态表示

HDOJ题目4939 Stupid Tower Defense(dp)

Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 1759    Accepted Submission(s): 498 Problem Description FSF is addicted to a stupid tower defense game. The goal of tower

hiho一下 第二十一周(线段树 离散化)

知识点1:离散化  对于这些区间来说,其实并不会在乎具体数值是多少,而是在他们的左右端点之间互相进行比较而已.所以你就把这N个区间的左右端点——2N个整数提出来,处理一下呗?你要注意的是,这2N个数是什么其实并不重要,你可以把这2N个数替换成为任何另外2N个数,只要他们之间的相对大小关系不发生改变就可以.” 解决方法: 那么我需要额外做的事情就是在构建线段树之前对区间进行预处理:将区间的左右端点选出来,组成一个集合,然后将这个集合依次对应到正整数集合上,并且利用这个对应将原来的区间的左右端点更换

HDU4939Stupid Tower Defense (有思想的dp)

Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 1557 Accepted Submission(s): 445 Problem Description FSF is addicted to a stupid tower defense game. The goal of tower defen

hdu4939 Stupid Tower Defense(Dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4939 Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 493    Accepted Submission(s): 129 Problem Description FSF is addicte

HDOJ 4939 Stupid Tower Defense

red放到后面显然更优,dp[i][j]表示前i个塔里有j个blue,最后枚举有多少个red Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 599    Accepted Submission(s): 163 Problem Description FSF is addicted to

hiho一下 第115周:网络流一?Ford-Fulkerson算法 (Edmond-Karp,Dinic,SAP)

来看一道最大流模板水题,借这道题来学习一下最大流的几个算法. 分别用Edmond-Karp,Dinic ,SAP来实现最大流算法. 从运行结过来看明显SAP+当前弧优化+gap优化速度最快.   hiho一下 第115周:网络流一•Ford-Fulkerson算法 原题网址:http://hihocoder.com/contest/hiho115/problem/1 网络流一·Ford-Fulkerson算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和

hdu 4939 Stupid Tower Defense

Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1589    Accepted Submission(s): 452 Problem Description FSF is addicted to a stupid tower defense game. The goal of tower