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出来看看这两个值是否相等. 想等 ...
随机推荐
- java反射(java.lang.reflect) ---普通单例模式唯一性问题
1. 普通的饱汉式.饿汉式 package org.bighead.test2; public class TestPrivate { private String str = "strPr ...
- go语言学习-常用命令(四)
go常用命令 go get:获取远程包(得装git) go run:直接运行程序(写代码时调试用) go build:测试编译,检查是否有编译错误 go fmt:格式化代码(一般不咋用,IDE都自带了 ...
- 把exe注册为windows服务
1.需要工具 Instsrv.exe(可以给系统安装和删除服务) Srvany.exe(可以让程序以服务的方式运行) 2.运行cmd,输入注册服务命令 "instsrv.exe完整路径&qu ...
- 【PAT】B1018 锤子剪刀布
抄的柳婼小姐姐的,感觉三个数求最大那里用的真棒 #include <stdio.h> int main() { int N; scanf("%d", &N); ...
- Linux内存管理 (6)vmalloc
专题:Linux内存管理专题 关键词:vmalloc.页对齐.虚拟地址连续.物理不连续 至此,已经介绍了集中内核中内存分配函数,在开始简单做个对比总结Linux中常用内存分配函数的异同点,然后重点介绍 ...
- UOJ143 万圣节的数列 构造
传送门 做过这道题,然后这道题告诉你怎么构造数据-- 一种可行的构造方式是:将奇数和偶数分成两半,奇数放在偶数前面,然后除以2,再递归下去处理. 构造的正确性是显然的:如果存在"奇数偶数奇数 ...
- 添加jar包到本地Maven仓库
在使用Maven的过程中,经常碰到有些jar包在中央仓库没有的情况.如果公司有私服,那么就把jar包安装到私服上.如果没有私服,那就把jar包安装到本地Maven仓库.今天介绍2种 ...
- 循环语句--do...while
do...while循环 格式: 执行流程 执行顺序:①③④>②③④>②③④…②不满足为止. ①负责完成循环变量初始化. ②负责判断是否满足循环条件,不满足则跳出循环. ③具体执行的语句 ...
- Flask —— 信号(5)
Flask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为. pip3 install blinker 1. 内置信号 request_started = ...
- locust安装及其简单使用----基于python的性能测试工具
1.已安装python3.6 ,安装步骤略 pip安装: pip install locust 检查locust是否安装成功 locust --help 2.安装 pyzmq If you inten ...