题意是:

一群男生和一群女生玩游戏:给出一棵 n 个节点的树,这棵树的每条边有一个权值 0 或 1。 在一局游戏开始时,确定一个节点作为根。从女生开始,双方轮流进行操作。

当一方操作时,要先选择一个不为根且到其父亲的边权为 1 的点,然后找出这个点到根节点的简单路径,将路径上所有边的权值翻转(即 0 变成 1,1 变成 0 )。

当一方无法操作时(即所有边的边权均为 0),另一方就获得了胜利。双方均采用最优策略,若女生获胜,则输出 “Girls win!”,否则输出“Boys win!”。

每局之间可能会有修改边权的操作,且每局游戏指定的根节点也可能是不同的。

开始时以为会很麻烦,借鉴了别人的博客,才想到修改边权只能每次修改一条边的,有了一些思路:

首先要明确结果只有两种,当操作数为奇数时女生获胜,当操作数为偶数时男生获胜。

一、 这种情况下需要经过两次操作才能将所有权值置 0 ;二、 这种情况下需要经过一次或三次操作才能将所有权值置 0 ;

三、这种情况下需要经过两次或四次操作才能将所有权值置 0 ;四、 这种情况下需要经过三次或五次操作才能将所有权值置 0。

上述四种情况的结论是只要进行操作就一定会出现的,不一定要特别采用最优策略,也就是说情况出现后先手与后手的输赢已经确定,双方只要按规则操作即使想可以改变结果也

无法做到,其实应该还有第五种情况,就是都为 0 的情况,这种情况下需要零次操作才能将所有权值置 0。

发现,当与根结点相连的边权和为偶数时需要且一定经过偶数次操作才能将所有权值置 0,当与根结点相连的边权和为奇数时需要且一定经过奇数次操作才能将所有权值置 0。

开始时打算用 40000*40000 的 bool 数组去存,但还是超内存了……

错误代码:

 #include <bits/stdc++.h>
using namespace std;
bool p[][];
int main()
{
int t,n,m,x,y,z;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(p,,sizeof(p));
for(int i = ; i < n; ++i)
{
scanf("%d%d%d",&x,&y,&z);
p[x][y] = z;
p[y][x] = z;
}
for(int i = ; i < m; ++i)
{
scanf("%d",&z);
if(z)
{
scanf("%d%d%d",&x,&y,&z);
p[x][y] = z;
p[y][x] = z;
}
else
{
scanf("%d",&z);
x = ;
for(int i = ; i < ; ++i)
if(p[z][i]) ++x;
if(x&) puts("Girls win!");
else puts("Boys win!");
}
}
}
return ;
}

改成 vector 数组才过了

代码如下:

 #include <bits/stdc++.h>
using namespace std;
vector<int> p[];
int num[];
int main()
{
int t,x,y,z,n,m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(num,,sizeof(num));
memset(p,,sizeof(p));
for(int i = ; i < n; ++i)
{
scanf("%d%d%d",&x,&y,&z);
if(z)
{
++num[x];
++num[y];
p[x].push_back(y);
p[y].push_back(x);
}
}
for(int i = ; i < m; ++i)
{
scanf("%d",&z);
if(z)
{
scanf("%d%d%d",&x,&y,&z);
vector<int>::iterator it1 = find(p[x].begin(),p[x].end(),y);
vector<int>::iterator it2 = find(p[y].begin(),p[y].end(),x);
if(it1!=p[x].end() && z==)
{
--num[x];
--num[y];
p[x].erase(it1);
p[y].erase(it2);
}
if(it1==p[x].end() && z==)
{
++num[x];
++num[y];
p[x].push_back(y);
p[y].push_back(x);
}
}
else
{
scanf("%d",&z);
if(num[z]&) puts("Girls win!");
else puts("Boys win!");
}
}
}
return ;
}

感谢这篇博客的作者:

https://blog.csdn.net/song_4/article/details/53063309

HDU 5963(游戏 博弈+规律)的更多相关文章

  1. 最简单的博弈论——HDU - 5963 朋友 (博弈)

    OK,好的先看一下题意: B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的: 给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点作为根. ...

  2. HDU 5963 朋友 (找规律,思维)

    HDU 5963 朋友 题目大意 B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的: 给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点 ...

  3. HDU 4315 阶梯博弈变形

    n个棋子,其中第k个是红色的,每个棋子只能往上爬,而且不能越过.重叠其他棋子,谁将红色棋子移到顶部谁赢. 由于只能往上爬,所以很像阶梯博弈.这题有2个限制,棋子不能重叠,有红棋存在 首先不考虑红色棋, ...

  4. HDU 1564 简单博弈 水

    n*n棋盘,初始左上角有一个石头,每次放只能在相邻的四个位置之一,不能操作者输. 如果以初始石头编号为1作为后手,那么对于每次先手胜的情况其最后一步的四周的编号必定是奇数,且此时编号为偶数,而对于一个 ...

  5. HDU 5963 朋友(找规律博弈)

    http://acm.hdu.edu.cn/showproblem.php?pid=5963 题意: 思路: 我们可以先只考虑单链,自己试几种案例就可以发现规律,只有与根相连的边为1时,只需要奇数次操 ...

  6. HDU 5963 博弈

    http://acm.hdu.edu.cn/showproblem.php?pid=5963 题目大意:中文题 思路:看ICPC camp好了,简单易懂:https://async.icpc-camp ...

  7. vijos 1004 伊甸园日历游戏 博弈+打表找规律

    描述 Adam和Eve玩一个游戏,他们先从1900.1.1到2001.11.4这个日期之间随意抽取一个日期出来.然后他们轮流对这个日期进行操作: 1 : 把日期的天数加1,例如1900.1.1变到19 ...

  8. 【博弈】HDU - 5963 朋友

    题目 B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的: 给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点作为根.接下来从女生开始,双 ...

  9. HDU 1527 (Wythoff 博弈) 取石子游戏

    对于Wythoff博弈中的两个数列,An和Bn有这样的关系: An + n = Bn, An = floor(φ * n) 所以我们可以根据a b的差值来计算一个新的a出来看看这两个值是否相等. 想等 ...

随机推荐

  1. laravel部署创建新项目 助记

    打开进入homestead虚拟机,并进入code文件夹 cd ~/homestead && vagrant up && vagrant ssh cd ~/Code 进行 ...

  2. centos7搭建ftp

    1.检查安装vsftpd软件 rpm –qa |grep vsftpd 这里显示已经安装了,我们来卸载它重新安装 卸载vsftpd命令 rpm –e 文件名 显示卸载完成 安装vsftpd命令 Yum ...

  3. SQLServer之数据类型解析

    数字 int.bigint.smallint 和 tinyint 使用整数数据的精确数字数据类型. 数据类型 范围 存储 tinyint 0 到 255. 1 字节 smallint -2^15 (- ...

  4. easyUI行删除

    function removeRow(target,number) { if (number) { var index = getRowIndex(target); $datagrid.datagri ...

  5. 用 PLSQL 创建新用户及导入 dmp

    一.创建表空间 在导入 dmp 文件之前,你要在数据库里面给它分配一片存储它的地方(表空间). 如果我们知道需要导入的数据库的表空间直接创建就可以,如果不不知道,也没有关系,我们可以用 txt 打开 ...

  6. SpringBoot打包成war

    关于SpringBoot打成jar包以及jar包如何在Linux持久运行,我在前面已经说过了,所以本次不再赘述. 关于SpringBoot打包成war,其实步骤特别简单,如下图所示(如果是jar,通常 ...

  7. Linux内核入门到放弃-设备驱动程序-《深入Linux内核架构》笔记

    I/O体系结构 总线系统 PCI(Peripheral Component Interconnect) ISA(Industrial Standard Architecture) SBus IEEE1 ...

  8. DeconvNet 论文阅读理解

    学习语义分割反卷积网络DeconvNet 一点想法:反卷积网络就是基于FCN改进了上采样层,用到了反池化和反卷积操作,参数量2亿多,非常大,segnet把两个全连接层去掉,效果也能很好,显著减少了参数 ...

  9. Linux笔记-ps -aux的结果解析

    参考: https://blog.csdn.net/flyingleo1981/article/details/7739490 ps 的参数说明ps 提供了很多的选项参数,常用的有以下几个: l 长格 ...

  10. Spring Boot2.0使用Spring Security

     一.Spring Secutity简介     Spring 是一个非常流行和成功的 Java 应用开发框架.Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性 ...