• 广东工业大学2016校赛决赛-网络赛 1169 Problem A: Krito的讨伐 优先队列


    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

    1 5 2 0 1 0 2 2 3 2 4 11 3 10 2 1 11 0

    Sample Output

    Oh yes.

    HINT

    题解:

      题目说中完全杀死这个节点的怪物才能通过这个节点,我们从起始点开始,将能选择的 怪物 压如队列并且这队列是按照防御力从小到大优先的,

      这样可以选择的 点都在这个队列中

      如果当前怪物能被杀死,那么更所在节点信息,单这个节点没有怪物的时候我们加入其儿子的节点信息供选择

      如过不能杀死,也就是不能清除所有的怪物了,跳出即可

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    #include<queue>
    using namespace std;
    const int N = 1e6+10, M = 1e3+200, mod = 1e9+9, inf = 1e9+9;
    typedef long long ll;
     
    vector<pair<int,int > >P[M+5];
    int T,n,m,a,b,vis[N],H[N];
    int  now ;
    struct ss{
    int f,s,id;
    friend bool operator < (ss a, ss b){return  a.f > b.f;}
    };
    vector<int> G[N];
    int main() {
        scanf("%d",&T);
        while(T--) {
            scanf("%d%d",&n,&m);
            for(int i=0;i<n;i++) G[i].clear();
            for(int i=1;i<n;i++) scanf("%d%d",&a,&b) ,G[a].push_back(b),G[b].push_back(a);
            scanf("%d",&now);
            for(int i=0;i<M;i++) P[i].clear();
            for(int i=1;i<=m;i++) {
                    int x,add,f;
                scanf("%d%d%d",&x,&f,&add);
                P[x].push_back(make_pair(f,add));
            }
            for(int i=0;i<n;i++) if(P[i].size()==0) P[i].push_back(make_pair(0,0));
            memset(vis,0,sizeof(vis));
            memset(H,0,sizeof(H));
            int ans = 0;
            priority_queue<ss> q;
                for(int j=0;j<P[0].size();j++) {
                    int v = 0;
               ss  K;
               K.f = P[v][j].first;
               K.s = P[v][j].second;
               K.id = v;
                    q.push(K);
                }
            int times = 0;
            while(!q.empty()) {
                ss k;
                k = q.top();
                if(now>k.f) now+=k.s,q.pop(),H[k.id]++;
                else break;
                if(H[k.id] == P[k.id].size()) {
                     for(int i=0;i<G[k.id].size();i++)
                     for(int j=0;j<P[G[k.id][i]].size();j++) {
                            int v = G[k.id][i];
                            if(vis[v]) continue;
                            ss  K;
                            K.f = P[v][j].first;
                            K.s = P[v][j].second;
                            K.id = v;
                            q.push(K);
                    }
                    vis[k.id] = 1;
                }
            }
            for(int i=0;i<n;i++) if(vis[i]) ans++;
            if(ans == n) puts("Oh yes.");
            else puts("Good Good Study,Day Day Up.");
        }
        return 0;
    }
  • 相关阅读:
    PHP 数据库连接
    php函数
    php数组基础
    Jquery元素追加和删除
    jquery获取父,同,子级元素
    深入理解css中position属性及z-index属性
    php运算符
    MySQL主键与索引的区别和联系
    php 常量
    20150408--Sphinx+邮件激活-02
  • 原文地址:https://www.cnblogs.com/zxhl/p/5375486.html
Copyright © 2020-2023  润新知