HDU 5963(游戏 博弈+规律)
题意是:
一群男生和一群女生玩游戏:给出一棵 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(游戏 博弈+规律)的更多相关文章
- 最简单的博弈论——HDU - 5963 朋友 (博弈)
OK,好的先看一下题意: B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的: 给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点作为根. ...
- HDU 5963 朋友 (找规律,思维)
HDU 5963 朋友 题目大意 B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的: 给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点 ...
- HDU 4315 阶梯博弈变形
n个棋子,其中第k个是红色的,每个棋子只能往上爬,而且不能越过.重叠其他棋子,谁将红色棋子移到顶部谁赢. 由于只能往上爬,所以很像阶梯博弈.这题有2个限制,棋子不能重叠,有红棋存在 首先不考虑红色棋, ...
- HDU 1564 简单博弈 水
n*n棋盘,初始左上角有一个石头,每次放只能在相邻的四个位置之一,不能操作者输. 如果以初始石头编号为1作为后手,那么对于每次先手胜的情况其最后一步的四周的编号必定是奇数,且此时编号为偶数,而对于一个 ...
- HDU 5963 朋友(找规律博弈)
http://acm.hdu.edu.cn/showproblem.php?pid=5963 题意: 思路: 我们可以先只考虑单链,自己试几种案例就可以发现规律,只有与根相连的边为1时,只需要奇数次操 ...
- HDU 5963 博弈
http://acm.hdu.edu.cn/showproblem.php?pid=5963 题目大意:中文题 思路:看ICPC camp好了,简单易懂:https://async.icpc-camp ...
- vijos 1004 伊甸园日历游戏 博弈+打表找规律
描述 Adam和Eve玩一个游戏,他们先从1900.1.1到2001.11.4这个日期之间随意抽取一个日期出来.然后他们轮流对这个日期进行操作: 1 : 把日期的天数加1,例如1900.1.1变到19 ...
- 【博弈】HDU - 5963 朋友
题目 B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的: 给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点作为根.接下来从女生开始,双 ...
- HDU 1527 (Wythoff 博弈) 取石子游戏
对于Wythoff博弈中的两个数列,An和Bn有这样的关系: An + n = Bn, An = floor(φ * n) 所以我们可以根据a b的差值来计算一个新的a出来看看这两个值是否相等. 想等 ...
随机推荐
- SQLServer之创建AFETER DELETE触发器
DML AFTER DELETE触发器创建原理 触发器触发时,系统自动在内存中创建deleted表或inserted表,inserted表临时保存了插入或更新后的记录行,deleted表临时保存了删除 ...
- 上传本地文件到GitHub上
问题解决 今天在windows上上传本地文件到github,出现用户名和仓库不匹配的情况,解决方式如下: 打开控制面板,选择用户账户 把该删除的账户删除一下就行了. 上传文件的步骤如下: 将上传的文件 ...
- 【Teradata】安装SQL Assistant和Administrator 16.20(含查看.net版本)
1.安装介质获取: 获取的路径:connections==>Gateways==>Customer Services==>TOOLS & APPLICATIONS(点击Mor ...
- duilib
https://www.cnblogs.com/lin1270/p/4109305.html
- 数据采集工具Telegraf:简介及安装
接着上一篇博客:InfluxDB简介及安装,这篇博客介绍下Linux环境下Telegraf安装以及其功能特点... 官网地址:influxdata 官方文档:telegraf文档 环境:CentOS7 ...
- ELK的安装
首先得安装好Elasticsearch.Kibana和Logstash(这里全部使用rpm安装的是6.4.2版本,而且都是单机安装,暂时没有考虑分布式安装.) 服务器内存要求至少为4G,下图为运行起来 ...
- 《通过C#学Proto.Actor模型》之PID
PID对象是代表Actor对象的进程,是能过Actor.Spawn(props)获取的:它有什么成员呢?既然代理Actor,首先有一个ID,标识自己是谁,Actor在Spawn时可以命名这个ID,否则 ...
- SkylineGlobe 7.0.1 & 7.0.2版本Web开发 如何实现土方量计算
土方量计算,或者叫填挖方计算,体积计算,Skyline在很早的版本中就提供了这个的功能. 目前的软件版本,不仅仅可以对地形修改对象进行土方量计算,还可以在FLY工程中导入DEM数字高程模型数据,计算不 ...
- MariaDB第四章:视图,事务,索引,外键--小白博客
视图 对于复杂的查询,在多个地方被使用,如果需求发生了改变,需要更改sql语句,则需要在多个地方进行修改,维护起来非常麻烦 假如因为某种需求,需要将user拆房表usera和表userb,该两张表的结 ...
- 家庭记账本小程序之java代码部分(java web基础版二)
1.连接数据库 package util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Res ...