HDU 4664 Triangulation-SG函数
http://acm.hdu.edu.cn/showproblem.php?pid=4664
一个平面上有n个点(一个凸多边形的顶点),每次可以连接一个平面上的两个点,不能和之前的边相交,如果平面上已经出现了一个三角形,则不能在这个平面上继续连接边了。
可以看出这个是公平游戏,可用sg函数计算,而n个游戏的话,每个游戏的nim和便是他们的最终结果。
那么对于当前局面SG(x),它的后继局面为 任选两个点连接后,得到的局面是被该线分割成两部分,如果下一个人在这条线的两个端点任意一个出发再连一条线,则下下个人就可以连成三角形使得游戏结束,因此下一个人必不会再从这两个端点连线。因此后继局面为sg(i)与sg(x-i-2) [0<=i<=x-2]
即得到sg函数为: SG(X)=mex{sg(i)^sg(x-i-2)} [0<=i<=x-2]
由于数据的n很大,打表出前1000项观察可以得到循环节。。。打表
#include <cstdio>
#include <cstring>
typedef long long ll;
#define N 1005
bool vis[N];
int sg[N];
int ans[]= {4,8,1,1,2,0,3,1,1,0,3,3,2,2,4,4,5,5,9,3,3,0,1,1,3,0,2,1,1,0,4,5,3,7};
int SG(int x)
{if (sg[x] != -1) return sg[x];if (x == 0) return 0;if (x == 1) return 0;if (x == 2) return 1;if (x == 3) return 1;memset(vis, false, sizeof(vis));//SG(X)=mex{sg(i)^sg(x-i-2)} [0<=i<=x-2]for (int i=0; i<x-1; i++) vis[SG(i)^SG(x-i-2)] = true;for (int i=0; ; i++) if (!vis[i]) return i;
}
int get_sg(int x)
{if (x <= 100) return sg[x];return ans[x%34];
}
int main()
{
// freopen("out.txt","w",stdout);memset(sg, -1, sizeof(sg));for (int i=0; i<=102; i++){sg[i] = SG(i);// printf("%d,",sg[i]);}int T, n, x;scanf("%d", &T);while (T--){scanf("%d", &n);int ans = 0;while (n--){scanf("%d", &x);ans ^= get_sg(x);}puts(ans ? "Carol" : "Dave");}return 0;
}
HDU 4664 Triangulation-SG函数相关推荐
- hdu 4664 Triangulation
// 题意: 给定N个平面,每个平面有ni个点 // ni个点组成一个凸多边形 // // 然后在N个平面上进行游戏,每次选取一个平面进行 // 在每个平面上可以选择两个点链接一条直线 // 每次选择 ...
- hdu - 4664 - Triangulation(博弈SG)
题意:有N个平面,每个平面有一些点,两个人在玩游戏,每轮将2个点连起来,连线不可交其他已连的线,谁先连出一个空的三角形或者对方不可连线,他在这个平面内就胜出,但对方可以在其他平面连线,最后谁动不了谁就 ...
- HDU - 1536 S-Nim(sg函数)
题目链接:点击查看 题目大意:根据尼姆博弈的规则,现在更改为每次只能从任意一堆中取走规定集合中的数目,问每次游戏先手必胜还是必败 题目分析:sg打表模板题,这里挂一个大牛的博客,讲得是尼姆博弈和sg函 ...
- HDU 1536 求解SG函数
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<set&g ...
- HDU 1848(SG函数应用)
原文链接:http://hi.baidu.com/king___haha/item/542a071140107f9598ce337c fib[1..]={1,2,3,5,8,13,21,...};是菲 ...
- SG函数入门HDU 1848
SG函数 sg[i]为0表示i节点先手必败. 首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数.例如mex{0,1,2,4}=3. ...
- HDU - 1079 Calendar Game(博弈打表sg函数)
题目链接:点击查看 题目大意:给出一个日期,两个人轮流按照规则操作,具体规则如下: 每次可以增加一天 每次可以增加一个月到下一个月的当天 首先到达2001年11月4日的人获胜,问谁能获胜 题目分析:因 ...
- Fibonacci again and again HDU - 1848(尼姆博弈+SG函数的运用+SG函数详解)
题意: 给出三堆石子(m,n,p个),两人每次只能取斐波那契数f[i]个,最先取光所有石子者取胜 题目: 任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义 ...
- HDU 1404 Digital Deletions(博弈 + SG函数打表)
Digital Deletions 思路 一道博弈论的题目,考虑到题目所给的范围是字符长度为1−>61-> 61−>6,所以我们可以考虑暴力打表出10610 ^ 6106内的所有状态 ...
最新文章
- 笔录软件在linux系统,Linux下查看已安装软件
- SharePoint Application Page启用匿名访问
- 吃货莫跑小小程序冲刺07
- uva 816(经典bfs例子)
- cursor 过滤 android,Android cursor query方法详解
- Happy Valentine's Day
- flutter 获取定位_定位Flutter内存问题如何做
- pm2 简介与常用指令
- 蓝图出炉:大家将能够利用英伟达技术打造自己的自动驾驶车辆
- 《Redis开发与运维》学习第六章
- Cterm里面自动发帖的Python脚本
- 服务器2008系统设置密码,win2008服务器设置密码
- 计算机系统盘怎么扩充,Win7如何给C盘扩容 Win7系统电脑C盘扩容的办法
- php strpos 区分大小写么?,PHP strpos() 函数
- 论成长型思维的重要性
- VS2013+Ceres编译教程 Win7系统
- 微信小程序7个步骤告诉你怎么投放广告位
- POSIX标准总体分析 执行调度 消息传递 调度参数 进程调度函数 关闭消息队列 得到消息队列参数 设置调度参数 时钟和定时器 时钟和定时器函数 消息传递函数 打开消息队列 设置消息队列参数
- 关于微信小程序反编译获取源码
- 手把手带你完成第一个 android 小程序(快递App)