• GDUT Krito的讨伐(bfs&&优先队列)


    题意

    Description

    Krito最终干掉了99层的boss,来到了第100层。

    第100层能够表示成一颗树。这棵树有n个节点(编号从0到n-1),树上每个节点可能有非常多仅仅怪物。 Krito如今在0号节点,如今它想要区清除这一层全部的怪物。他如今有atk大小的攻击力。

    仅仅有当你的攻击力大于这仅仅怪物的防御力时,你才干够打败他。同一时候每打败仅仅怪物,你会获得一定的攻击力加成。一个节点可能存在着不止一仅仅怪兽,你要打败这个节点的全部怪物才干能够从这个节点通过,请问他能不能完毕这个任务?注意:不要求一次性杀光一个节点里面的全部怪物。

    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.
    

    思路

    由于从根节点開始,必须打败当前节点的全部怪物,才干够进入下一节点。贪心思想,先选择防御力低的怪物总是不会更坏。
    所以用一优先队列维护我们能够攻击到到怪物,一旦某节点怪物全杀完,则将其子节点怪物添加队列。
    假设当前最小防御力怪物都不能消灭。那么一定是失败的。

    代码

    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    #include <stdlib.h>
    #include <algorithm>
    #include <stack>
    #include <queue>
    using namespace std;
    #define LL long long
    
    struct Node
    {
        int id, def, add;
        friend bool operator < (Node a, Node b)
        {
            return a.def > b.def;
        }
    };
    
    bool g[1009][1009];
    int cnt[1009];
    vector<Node > v[1009];
    bool vis[1009];
    int n, m, k;
    
    void init()
    {
        memset(cnt, 0, sizeof(cnt));
        memset(g, 0, sizeof(g));
        memset(vis, 0, sizeof(vis));
        for(int i=0; i<n; i++)
            v[i].clear();
    }
    
    bool bfs()
    {
        priority_queue<Node> q;
        for(int i=0; i<v[0].size(); i++)
            q.push(v[0][i]);
    
        if(cnt[0] == 0)
        {
            Node t = {0, -1, 0};
            q.push(t);
        }
        vis[0] = 1;
        while(!q.empty())
        {
            Node t = q.top();
            q.pop();
    
            if(t.def == -1)
            {
                for(int i=0; i<n; i++)
                {
                    if(!vis[i] && g[t.id][i] == 1)
                    {
                        vis[i] = 1;
                        for(int j=0; j<cnt[i]; j++)
                            q.push(v[i][j]);
                        if(cnt[i] == 0)
                        {
                            Node x = {i, -1, 0};
                            q.push(x);
                        }
                    }
                }
    
                continue;
            }
            if(t.def < k)
            {
                k += t.add;
                if(--cnt[t.id] == 0)
                {
    
                    t.def = -1;
                    q.push(t);
                }
            }
            else
                return false;
        }
        return true;
    }
    
    
    int main()
    {
        int T;
        scanf("%d", &T);
        while(T--)
        {
            init();
            scanf("%d%d", &n, &m);
            for(int i=1; i<n; i++)
            {
                int a, b;
                scanf("%d%d", &a, &b);
                g[a][b] = g[b][a] = 1;
            }
    
            scanf("%d", &k);
    
            for(int i=0; i<m; i++)
            {
                int a, b, c;
                scanf("%d%d%d", &a, &b, &c);
                Node t={a, b, c};
                v[a].push_back(t);
                cnt[a]++;
            }
    
            if(bfs())
                printf("Oh yes.
    ");
            else
                printf("Good Good Study,Day Day Up.
    ");
        }
        return 0;
    }
  • 相关阅读:
    Appium教程
    ES6对象类型判断
    MyBatisPlus的时间段和模糊查询
    一个div中多个元素垂直居中的一种解决办法
    @JsonFormat与@DateTimeFormat注解的使用
    java日期类型对象通过mybatis向数据库中的存取
    Vue.js单向绑定和双向绑定实例分析
    Maven的使用
    如何将本地的项目提交到码云的远程仓库
    Linux CentOS7 的安装
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7258216.html
Copyright © 2020-2023  润新知