广东工业大学2016校赛决赛-网络赛 A题 Krito的讨伐
2016-04-12 20:51
627 查看
Problem A: Krito的讨伐
Description
Krito终于干掉了99层的boss,来到了第100层。第100层可以表示成一颗树,这棵树有n个节点(编号从0到n-1),树上每一个节点可能有很多只怪物。 Krito现在在0号节点,现在它想要区清除这一层所有的怪物。他现在有atk大小的攻击力。只有当你的攻击力大于这只怪物的防御力时,你才可以打败他,同时每打败只怪物,你会获得一定的攻击力加成。一个节点可能存在着不止一只怪兽,你要打败这个节点的所有怪物才能可以从这个节点通过,请问他能不能完成这个任务?注意:不要求一次性杀光一个节点里面的所有怪物。相关知识: 摘自维基百科 在计算机科学中,树(英语:tree)是一种抽象资料型别(ADT)或是实作这种抽象资料型别的数据结构,用来模拟具树状结构性质的资料集合。它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 1.每个节点有零个或多个子节点; 2.没有父节点的节点称为根节点; 3.每一个非根节点有且只有一个父节点; 4.除了根节点外,每个子节点可以分为多个不相交的子树;
Input
第1行:一个数T,表示有T个测试样例(0<=T<=50) ,接下来有T个测试样例对于每一个测试样例:
第1行:两个整数n,m表示这棵树有n个节点,m只怪兽(0<=n<=1000 ,0<=m <=100)
第2至n-1行: 两个整数u,v表示编号为u,v之间的节点有一条无向边,题目保证不会成环。(0<=u,v<n , u!=v)
第3行: 一个整数atk,表示Krito的初始化攻击力(0<=atk<=100)
第4至3+m行:两个整数id,def,add_atk,表示在编号为id的点上,有一只防御力为def的怪物,打败后可以增加add_atk点的攻击力。(0<=add_atk,def<=100)
Output
对于每一个测试样例,如果Krito能够清除所有的怪物,则输出“Oh yes.” 否则,输出“Good Good Study,Day Day Up.”
Sample Input
15 20 10 22 32 4113 10 21 11 0
Sample Output
Oh yes.
HINT
解题思路:从根节点dfs依次把所有可达的怪物加到一个优先队列,每次从队列中取出一个判断是否满足题意,如果不满足则退出,满足则增加攻击力,并把该节点上的怪物数量减一,并从该节点开始dfs把所有可达怪物加到优先队列即可。AC代码如下:
#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> #include <string> #include <vector> #include <list> #include <map> #include <set> #include <queue> #include <cctype> #include <cstdlib> #include <sstream> #define sqr(x) ((x)*(x)) #define lson le,mid,rt<<1 #define rson mid+1,ri,rt<<1|1 #define inf 0x3f3f3f3f #define eps 1e-6 typedef long long ll; using namespace std; const double PI = 4.0*atan(1.0); const int maxn = 1010; struct node{ int id, def, add_atk; node(){} node(int a,int b,int c){def = a; add_atk = b;id = c;} int operator<(const node &n) const{ return def > n.def; } }; vector<int> ve[maxn]; vector<node> vn[maxn]; int atk, m, n, cnt[maxn], vis[maxn]; priority_queue<node> pq; void dfs(int root){ if(cnt[root] != 0){ for(int i = 0;i < vn[root].size();++i) pq.push(vn[root][i]); vn[root].clear(); return; } for(int i = 0;i < ve[root].size();++i){ if(!vis[ve[root][i]]){ vis[ve[root][i]] = 1; dfs(ve[root][i]); } } } bool solve(){ int root = 0; while(!pq.empty()) pq.pop(); vis[root] = 1; dfs(root); while(!pq.empty()){ node t = pq.top(); pq.pop(); if(atk <= t.def){ return 0; } atk += t.add_atk; root = t.id; cnt[root]--; dfs(root); } return 1; } int main(){ int T,a,b,c; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); for(int i = 0;i <= n;++i){ ve[i].clear(); vn[i].clear(); } for(int i = 0;i < n-1;++i){ scanf("%d%d",&a,&b); ve[b].push_back(a); ve[a].push_back(b); } scanf("%d",&atk); memset(cnt,0,sizeof(cnt)); memset(vis,0,sizeof(vis)); for(int i = 0;i < m;++i){ scanf("%d%d%d",&a,&b,&c); vn[a].push_back(node(b,c,a)); cnt[a]++; } printf(solve()?"Oh yes.\n":"Good Good Study,Day Day Up.\n"); } return 0; }
相关文章推荐
- HTTPS原理(转)
- TCP协议中的三次握手和四次挥手(图解)
- 关于解决HTTP Status 405 - HTTP method POST is not supported by this URL方法之一
- CentOS6网络配置
- 10分钟理解TCP/IP各个协议以及协议之间的关系
- HTTP Content-type
- HttpClient介绍
- VijosP1595:学校网络(有向图变强连通图)
- http状态码详解
- JAVA网络编程
- 【B/S】HTTP错误500.23-Internal Server Error
- 安卓MVP设计思想,结合greendao+okhttp通过一个登陆的例子来进行学习(eclipse篇)
- 嵌入式 hi3518平台获取网络环境中的ip、netmask、broadcast等信息
- 嵌入式 hi3518平台以太网网络模块设计包括重连机制和网线检测机制
- 一个简单的http服务器的实现 含源代码
- 3117 高精度练习之乘法——http://codevs.cn/problem/3117/
- Android登录客户端,验证码的获取,网页数据抓取与解析,HttpWatch基本使用
- 计算机网络-IP类型判断
- openfire 成功安装后无法启动,无法访问http://ip:9090
- WebView弹出Alert 去掉Http:--网址Title