GDUT1169:Krito的讨伐(树 + 优先队列)

    xiaoxiao2021-03-25  97

    1169: Krito的讨伐

    Time Limit: 1 Sec   Memory Limit: 128 MB Submit: 628   Solved: 105

    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

    Source

    思路:不断将就近的怪物扔进优先队列即可。 # include <iostream> # include <cstdio> # include <cstring> # include <vector> # include <queue> # define LL long long using namespace std; int vis[1001]; struct Node { int id, def, add; Node(int x=0, int y=0, int z=0) { id = x; def = y; add = z; } }; struct node { int num; vector<Node>all; }; bool operator<(Node a, Node b) { return a.def > b.def; } priority_queue<Node>Q; vector<int>v[1001]; node a[1001]; void dfs(int now) { vis[now] = 1; if(a[now].num == 0) { for(int i=0; i<v[now].size(); ++i) if(!vis[v[now][i]]) dfs(v[now][i]); } else { for(int j=0; j<a[now].num; ++j) Q.push(a[now].all[j]); } } int main() { int n, m, t, x, y, z, atk; scanf("%d",&t); while(t--) { bool flag = true; memset(vis, 0, sizeof(vis)); memset(a, 0, sizeof(a)); while(!Q.empty()) Q.pop(); for(int i=0; i<=1000; ++i) v[i].clear(); scanf("%d%d",&n,&m); for(int i=0; i<n-1; ++i) { scanf("%d%d",&x,&y); v[x].push_back(y); v[y].push_back(x); } scanf("%d",&atk); for(int i=0; i<m; ++i) { scanf("%d%d%d",&x,&y,&z); a[x].num++; a[x].all.push_back(Node(x, y, z)); } dfs(0); while(!Q.empty()) { Node tmp = Q.top(); Q.pop(); if(tmp.def > atk) break; atk += tmp.add; if(--a[tmp.id].num == 0) { int id = tmp.id; for(int i=0; i<v[id].size(); ++i) if(!vis[v[id][i]]) dfs(v[id][i]); } } for(int i=0; i<n; ++i) if(a[i].num) { flag = false; break; } if(flag) puts("Oh yes."); else puts("Good Good Study,Day Day Up."); } return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-33640.html

    最新回复(0)