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出来看看这两个值是否相等. 想等 ...
随机推荐
- windows拿到cmd权限之后常用命令
whoami // 查看当前用户名称 ipconfig // 查看本机ip信息,可加 /all 参数 netstat -ano // 查看端口清况 dir c:\ // 查看目录 typ ...
- 爬虫系列---scrapy post请求、框架组件和下载中间件+boss直聘爬取
一 Post 请求 在爬虫文件中重写父类的start_requests(self)方法 父类方法源码(Request): def start_requests(self): for url in se ...
- kubernetes 集群安装etcd集群,带证书
install etcd 准备证书 https://www.kubernetes.org.cn/3096.html 在master1需要安装CFSSL工具,这将会用来建立 TLS certificat ...
- rabbitMQ、activeMQ、zeroMQ、Kafka、Redis 比较
Kafka作为时下最流行的开源消息系统,被广泛地应用在数据缓冲.异步通信.汇集日志.系统解耦等方面.相比较于RocketMQ等其他常见消息系统,Kafka在保障了大部分功能特性的同时,还提供了超一流的 ...
- Git拉取、提交、迁出、合并、删除分之命令
#拉取代码 git clone -b 分之名称 git地址 #提交代码 git add . //:注释,if是第一次提交: $ git add --all . (请注意后面有个英文点(表示是当前目录) ...
- C. Songs Compression(简单贪心)
水题 #include<iostream> #include<algorithm> using namespace std; #define LL long long ; st ...
- Qt License 解读
对于桌面和移动平台应用 官方说明如下 Qt for Application Development lets you create applications for desktop and mobil ...
- python小白——进阶之路——day1天---认识python和变量、注释
###-python的认知 89年开发的语言,创始人范罗苏姆(Guido van Rossum),别称:龟叔(Guido) (1)版本: python2.x原码不规范,重复较多 python3x:原码 ...
- 【区块链】【一】Hash 算法【转】
问题导读1.哈希算法在区块链的作用是什么?2.什么是哈希算法?3.哈希算法是否可逆?4.比特币采用的是什么哈希算法? 作用在学习哈希算法前,我们需要知道哈希在区块链的作用哈希算法的作用如下:区块链通过 ...
- 你不知道的 requestIdleCallback
本文副标题是 Request Schedule 源码解析一.在本章中会介绍 requestIdleCallback 的用法以及其缺陷, 接着对 React 团队对该 api 的 hack 部分的源码进 ...