GDUT——1169: Krito的讨伐(优先队列BFS)
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
Sample Output
一直觉得这题有毒,用最后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);
else
findmons(v);
}
}
}
int kill(const int &s)
{
if(!ran[s])
dfs(s);
else
findmons(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;
}
GDUT——1169: Krito的讨伐(优先队列BFS)的更多相关文章
- 广东工业大学2016校赛决赛-网络赛 1169 Problem A: Krito的讨伐 优先队列
Problem A: Krito的讨伐 Description Krito终于干掉了99层的boss,来到了第100层.第100层可以表示成一颗树,这棵树有n个节点(编号从0到n-1),树上每一个节点 ...
- hdu 1026 Ignatius and the Princess I【优先队列+BFS】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1026 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- ZOJ 649 Rescue(优先队列+bfs)
Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 【POJ3635】Full Tank 优先队列BFS
普通BFS:每个状态只访问一次,第一次入队时即为该状态对应的最优解. 优先队列BFS:每个状态可能被更新多次,入队多次,但是只会扩展一次,每次出队时即为改状态对应的最优解. 且对于优先队列BFS来说, ...
- Codeforces 677D - Vanya and Treasure - [DP+优先队列BFS]
题目链接:http://codeforces.com/problemset/problem/677/D 题意: 有 $n \times m$ 的网格,每个网格上有一个棋子,棋子种类为 $t[i][j] ...
- POJ 2449 - Remmarguts' Date - [第k短路模板题][优先队列BFS]
题目链接:http://poj.org/problem?id=2449 Time Limit: 4000MS Memory Limit: 65536K Description "Good m ...
- GDUT Krito的讨伐(bfs&&优先队列)
题意 Description Krito最终干掉了99层的boss,来到了第100层. 第100层能够表示成一颗树.这棵树有n个节点(编号从0到n-1),树上每个节点可能有非常多仅仅怪物. Krito ...
- 【UESTC 482】Charitable Exchange(优先队列+bfs)
给你n个物品交换,每个交换用r,v,t描述,代表需要用r元的东西花费t时间交换得v元的东西.一开始只有1元的东西,让你求出交换到价值至少为m的最少时间代价.相当于每个交换是一条边,时间为边权,求走到价 ...
- cdoj 482 优先队列+bfs
Charitable Exchange Time Limit: 4000/2000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Othe ...
随机推荐
- org.apache.catalina.session.StandardManager doLoad
转载自:http://www.cnblogs.com/java727/p/3300613.html SEVERE: IOException while loading persisted sessio ...
- java类初始化优先级
父类静态变量.父类静态代码块.子类静态变量.子类静态代码块.父类非静态变量.父类非静态代码块.父类构造函数.子类非静态变量.子类非静态代码块.子类构造函数
- MVC学习笔记---MVC生命周期
Asp.net应用程序管道处理用户请求时特别强调"时机",对Asp.net生命周期的了解多少直接影响我们写页面和控件的效率.因此在2007年和2008年我在这个话题上各写了一篇文章 ...
- Oracle主键操作
http://blog.csdn.net/zhanggnol/article/details/6221895
- ***PHP类型转换实例:$this->input->get()返回的结果是字符串类型(数字字符串转数字)
一个GET的REST API,请求有三个参数,且都是数字 用$this->input->get()方法获取后的结果是字符串,需要转换为数字:如果没有获取到数据,则会返回false,需要用e ...
- 浅析十三种常用的数据挖掘的技术&五个免费开源的数据挖掘软件
一.前 沿 数据挖掘就是从大量的.不完全的.有噪声的.模糊的.随机的数据中,提取隐含在其中的.人们事先不知道的但又是潜在有用的信息和知识的过程.数据挖掘的任务是从数据集中发现模式,可以发现的模式有很多 ...
- jquery+php实现用户输入搜索内容时自动提示
index.html <html> <head> <meta charset=;} #search_auto li a:hover{background:#D8D ...
- Spring获取ApplicationContext方式,和读取配置文件获取bean的几种方式
转自:http://chinazhaokeke.blog.163.com/blog/static/109409055201092811354236 Spring获取ApplicationContex ...
- 兼容古董级IE小结
IE6已经死亡,当然7,8,9,10也挂掉了.微软对IE11更下了狠手,对其停止了更新.以为前端就可以安安心心地写代码了.可是就是有些顽固分子,竟然用的还是IE6,尊崇客户至上的原则,就恶心着给他兼容 ...
- Eclipse中导入外部jar包
首先在项目下创建一个文件夹,保存我们的jar包. 在项目名上右击,依次点击[New]-->[Floder],打开新建文件夹窗口 输入文件夹名称[lib],点击[ok].我们通常在lib文件夹 ...