1169: Krito的讨伐

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 619  Solved: 102

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.

一直觉得这题有毒,用最后m是否等于0的方法写死活WA,然后换个方法重新写了下用从0开始拓展的方法写就可以过。

先上正确的代码:

#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<string>
#include<deque>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<map>
using namespace std;
#define INF 0x3f3f3f3f
#define MM(x,y) memset(x,y,sizeof(x))
typedef pair<int,int> pii;
typedef long long LL;
const double PI=acos(-1.0);
const int M=2010;
const int N=1010;
struct info
{int to;int pre;
};struct mons
{int d;int add;int cur;bool operator<(const mons &b)const{return d>b.d;}
};
info E[M];
int head[N],cnt,ran[N];
int vis[N],n,m,atk;
vector<mons> guaiwu[N];
priority_queue<mons>Q;
void add(int s,int t)
{E[cnt].to=t;E[cnt].pre=head[s];head[s]=cnt++;
}
void init()
{MM(head,-1);MM(vis,0);MM(ran,0);MM(vis,0);cnt=0;for (int i=0; i<N; i++)guaiwu[i].clear();while (!Q.empty())Q.pop();
}
void findmons(const int &s)
{if(guaiwu[s].empty())return ;for (int i=0; i<guaiwu[s].size(); i++)Q.push(guaiwu[s][i]);guaiwu[s].clear();
}
void dfs(const int &now)
{for (int i=head[now]; ~i; i=E[i].pre){int v=E[i].to;if(!vis[v]){vis[v]=1;if(!ran[v])dfs(v);elsefindmons(v);}}
}
int kill(const int &s)
{if(!ran[s])dfs(s);elsefindmons(s);while (!Q.empty()){mons now=Q.top();Q.pop();if(now.d>=atk)return 0;else{atk+=now.add;ran[now.cur]--;if(!ran[now.cur])dfs(now.cur);}}return 1;
}
int main(void)
{int tcase,i,j,a,b,D,A,X;scanf("%d",&tcase);while (tcase--){init();scanf("%d%d",&n,&m);for (i=0; i<n-1; ++i){scanf("%d%d",&a,&b);add(a,b);add(b,a);}scanf("%d",&atk);mons t;for (i=0; i<m; i++){scanf("%d%d%d",&t.cur,&t.d,&t.add);guaiwu[t.cur].push_back(t);ran[t.cur]++;}puts(!kill(0)?"Good Good Study,Day Day Up.":"Oh yes.");}return 0;
}

修改N次仍然是WA的代码(不解题目既然保证了是一棵树不知道错的哪里):

#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<string>
#include<deque>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<map>
using namespace std;
#define INF 0x3f3f3f3f
#define MM(x,y) memset(x,y,sizeof(x))
typedef pair<int,int> pii;
typedef long long LL;
const double PI=acos(-1.0);
const int N=1010;
struct info
{int cur;int d;int ATK;info(int c,int dd,int aa):cur(c),d(dd),ATK(aa){}info(){}bool operator<(const info &b)const{return d>b.d;}
};
vector<info>mon[N];
vector<int>E[N];
priority_queue<info>kill;
int ran[N];
int vis[N];int n,m,atk;void reachble(const int &s)
{int i,j;queue<int>Q;Q.push(s);while (!Q.empty()){int now=Q.front();Q.pop();for (i=0; i<E[now].size(); i++){int v=E[now][i];if(!vis[v]){vis[v]=1;if(!ran[v])Q.push(v);else{for (j=0; j<mon[v].size(); j++){if(mon[v][j].d!=-1){kill.push(info(v,mon[v][j].d,mon[v][j].ATK));mon[v][j].d=-1;}                 }   }               }}}
}
void init()
{for (int i=0; i<N; i++){E[i].clear();mon[i].clear();}while (!kill.empty())kill.pop();MM(vis,0);MM(ran,0);
}
bool cmp(const info &a,const info &b)
{return a.d<b.d;
}
int main(void)
{int i,j,tcase,x,y,d,a;scanf("%d",&tcase);for (int t=1; t<=tcase; t++){init();scanf("%d%d",&n,&m);       for (i=1; i<n; i++){scanf("%d%d",&x,&y);E[x].push_back(y);E[y].push_back(x);}scanf("%d",&atk);for (i=0; i<m; i++){scanf("%d%d%d",&x,&d,&a);mon[x].push_back(info(x,d,a));ran[x]++;}int flag=1;sort(mon[0].begin(),mon[0].end(),cmp);for (i=0; i<mon[0].size(); i++){if(mon[0][i].d>=atk){flag=0;break;} else{atk+=mon[0][i].ATK;--m;--ran[0];}    }if(!flag){puts("Good Good Study,Day Day Up.");continue;}vis[0]=1;reachble(0);while (!kill.empty()){info now=kill.top();kill.pop();if(now.d>=atk)break;atk+=now.ATK;--m;if(--ran[now.cur]==0)reachble(now.cur);}puts(m?"Good Good Study,Day Day Up.":"Oh yes.");}return 0;
}

转载于:https://www.cnblogs.com/Blackops/p/5766291.html

GDUT——1169: Krito的讨伐(优先队列BFS)相关推荐

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

    1169: Krito的讨伐 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 628  Solved: 105 Description Krito终于干 ...

  2. POJ 2312 Battle City 优先队列+BFS

    相信坦克大战大家都玩过吧,本题就是根据这个游戏设计的.坦克要从起点(Y),到目的地(T),坦克不能通过钢墙(S),河(R),可以在空地在行走(E),射击破坏砖墙(B),射击砖墙时不行走且花费一个单位的 ...

  3. LeetCode 1102. 得分最高的路径(优先队列BFS/极大极小化 二分查找)

    文章目录 1. 题目 2. 解题 2.1 优先队列BFS 2.2 极大极小化 二分查找 1. 题目 给你一个 R 行 C 列的整数矩阵 A.矩阵上的路径从 [0,0] 开始,在 [R-1,C-1] 结 ...

  4. 广度优先搜索BFS进阶(一):多源BFS、优先队列BFS、双端队列BFS

    一.多源BFS 在上一篇博客:广度优先搜索BFS基础中,我们接触到的BFS均是单起点(单源)的,但是对于某一些问题,其有多个起点,此类问题我们称为多源BFS问题.先思考下面一道例题: 1.腐烂的橘子 ...

  5. hdu 1026 Ignatius and the Princess I(优先队列+bfs+记录路径)

    以前写的题了,现在想整理一下,就挂出来了. 题意比较明确,给一张n*m的地图,从左上角(0, 0)走到右下角(n-1, m-1). 'X'为墙,'.'为路,数字为怪物.墙不能走,路花1s经过,怪物需要 ...

  6. BOJ 1433 Tom 的潜望镜 优先队列+BFS

    Description Tom和Jerry这对活宝最近又开始闹腾了,为了和Jerry斗智斗勇,Tom特地到北邮物理系学习光学的知识,通过自己的不懈努力,他终于学会了潜望镜的制作.学业期满后,他决定和J ...

  7. hiho 1613 墨水滴 [Offer收割]编程练习赛32 Problem C 优先队列+BFS

    这个题挺简单的,也挺有意思,我第一次做这种优先队列结合BFS的题目,给的数据量很大,暴力肯定TLE,但是我们可以用优先队列进行剪枝,先处理颜色深度高的点,就是这样吧,代码很短. #include &l ...

  8. POJ 3669(优先队列BFS)(对地图进行优化)

    题目新颖,解法也是比较难想的. 题目: Bessie听说有场史无前例的流星雨即将来临:有谶言:陨星将落,徒留灰烬.为保生机,她誓将找寻安全之所(永避星坠之地).目前她正在平面坐标系的原点放牧,打算在群 ...

  9. Instrusive hdu 5040 优先队列+BFS

    题目描述: The legendary mercenary Solid Matt gets a classic mission: infiltrate a military base. The mil ...

最新文章

  1. 测试openssl_encrypt
  2. Git Bash命令行基础
  3. UVa11100 The Trip,2007(贪心)
  4. Eclipse 报 “Exception in thread main java.lang.OutOfMemoryError: Java heap space ”错误的解决办法
  5. 【存储知识学习】第四章-七种RAID-《大话存储》阅读笔记
  6. oracle连接数据的oci和thin的区别
  7. java并发编程实践学习---java的类锁和对象锁
  8. C/Cpp / string 截取、替换、查找
  9. SAP Spartacus public API的概念 - index.ts
  10. java设计模式组合模式详解_《JAVA设计模式》之组合模式(Composite)
  11. android studio 导入包分不分动态静态,详解Android studio 动态fragment的用法
  12. HTML图形映射技术
  13. SLAM学习与求职经验分享_李阳阳
  14. Leetcode122. 买卖股票的最佳时机 II(贪心)
  15. 压力测试工具JMeter入门教程
  16. 学生社团管理系统PHP源码,学生社团管理系统 附带源码
  17. Code For Better 谷歌开发者之声——Google Play
  18. php原生检测用户,php代码在线测试_php检测用户在线状态的实例代码
  19. java类名不能以数字开头_java变量为什么不能以数字开头
  20. SISD、MIMD、SIMD、MISD_设计失控

热门文章

  1. 和导师的微信聊天翻车现场,你一定也经历过!
  2. 看集装箱号码识别技术如何解决港口拥堵
  3. 神经网络学习小记录2——利用tensorflow构建循环神经网络(RNN)
  4. Python绘制七段数码管 获取并显示当前系统时间
  5. Windows系统C语言检测键盘的状态
  6. symbian程序的前台运行和后台运行
  7. docker - 安装searx搜索引擎
  8. Google浏览器简体中文版下载
  9. 查询使用计算机的处理器型号是,cpu型号怎么看,怎么看电脑cpu型号?
  10. 该网站服务器出错了怎么回事,该网站服务器出错了是什么意思(图文)