HDU6015(思维题)
来源:互联网 发布:php实例 百度网盘 编辑:程序博客网 时间:2024/06/06 03:21
题目意思就是给你一颗树,
Bob可以在树上染色,就是选择一个点,并且将其周围的点涂黑
Alice可以将树上的一个点涂白
Bob还可以做一个操作,就是剪枝,剪枝之后影响的只是涂黑的操作,就是比如我涂一个点本来可以把周围的点全部染黑的,现在就是减掉的部分就不能染黑了
最后,当树全部都被涂完的话,我们就找树上有没有白点,如果有那么Alice赢了,否则就是Bob赢
那么题解就是判断,分m次能不能把这棵树分为只有两两相连的点,能,就Bob赢,否则Alice赢
为什么呢
首先,如果我把一棵树全部分为两两相连的点的话,Bob是肯定能赢的
如果不能分为两两相连的点
那么最后会只剩一个点或者,超过三个点
一个点的话肯定是Alice赢,超过三个点的话,就一定有一个点他的叶子节点>=2那么Alice把这个点涂白即可
下面是15msAC代码
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <vector>#define maxn 600#define inf 0x3f3f3f3fusing namespace std;int fa[maxn],m,n;vector<int> son[maxn];void DFS(int root){ vector<int>::iterator it; if (son[root].empty()) { m-=inf; return; } for (it=son[root].begin()+1;it!=son[root].end();it++) { m--; DFS(*it); } int ss=*(son[root].begin()); for (it=son[ss].begin();it!=son[ss].end();it++) { m--; DFS(*it); } return;}int main(){ int t; scanf("%d",&t); while(t--) { scanf("%d %d",&n,&m); memset(fa,0,sizeof(fa)); for (int k=0;k<maxn;k++) son[k].clear(); for (int k=1;k<n;k++) { int save; scanf("%d",&save); fa[k+1]=save; son[save].push_back(k+1); } DFS(1); if (m>=0) printf("Bob\n"); else printf("Alice\n"); } return 0;}
阅读全文
0 0
- HDU6015(思维题)
- HDU6015
- hdu6015
- HDU6015 Skip the Class
- HDU6015 Skip the Class
- BestCoder Round #92 1001 hdu6015
- HDU6015 Skip the Class (Map)
- 思维题
- BestCoder Round #92 1001 Skip the Class【HDU6015】【STL】
- HDU 5596 思维题(逆向思维)*
- 有意思的思维题
- HDU4357(数学思维题)
- Number Sequence(思维题)
- Acdreamoj1115(数学思维题)
- Java思维题
- zoj 3672 思维题
- zoj 3672 思维题
- ACdreamoj 1417 思维题
- nodejs通过tb-excel自定义解析Excel
- 【笨鸟先飞】android重新学习日记5---intent
- CodeForces
- oracle高级用法之自定义函数
- 简谈ICO
- HDU6015(思维题)
- JZOJ 3418. 【NOIP动态规划专题】选课
- 鸽巢原理
- Noip2012 Day1 T1 Vigenère 密码
- 3 资源管理
- mysql 视图 以及存储过程小总结
- 洗牌算法-Shuffle an Array
- ionic3+angular4动态设置入口页rootpage,根据不同的状态值来确定不同的入口页
- 命令行参数的获取