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函数相关推荐

  1. hdu 4664 Triangulation

    // 题意: 给定N个平面,每个平面有ni个点 // ni个点组成一个凸多边形 // // 然后在N个平面上进行游戏,每次选取一个平面进行 // 在每个平面上可以选择两个点链接一条直线 // 每次选择 ...

  2. hdu - 4664 - Triangulation(博弈SG)

    题意:有N个平面,每个平面有一些点,两个人在玩游戏,每轮将2个点连起来,连线不可交其他已连的线,谁先连出一个空的三角形或者对方不可连线,他在这个平面内就胜出,但对方可以在其他平面连线,最后谁动不了谁就 ...

  3. HDU - 1536 S-Nim(sg函数)

    题目链接:点击查看 题目大意:根据尼姆博弈的规则,现在更改为每次只能从任意一堆中取走规定集合中的数目,问每次游戏先手必胜还是必败 题目分析:sg打表模板题,这里挂一个大牛的博客,讲得是尼姆博弈和sg函 ...

  4. HDU 1536 求解SG函数

    1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<set&g ...

  5. HDU 1848(SG函数应用)

    原文链接:http://hi.baidu.com/king___haha/item/542a071140107f9598ce337c fib[1..]={1,2,3,5,8,13,21,...};是菲 ...

  6. SG函数入门HDU 1848

    SG函数 sg[i]为0表示i节点先手必败. 首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数.例如mex{0,1,2,4}=3. ...

  7. HDU - 1079 Calendar Game(博弈打表sg函数)

    题目链接:点击查看 题目大意:给出一个日期,两个人轮流按照规则操作,具体规则如下: 每次可以增加一天 每次可以增加一个月到下一个月的当天 首先到达2001年11月4日的人获胜,问谁能获胜 题目分析:因 ...

  8. Fibonacci again and again HDU - 1848(尼姆博弈+SG函数的运用+SG函数详解)

    题意: 给出三堆石子(m,n,p个),两人每次只能取斐波那契数f[i]个,最先取光所有石子者取胜 题目: 任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义 ...

  9. HDU 1404 Digital Deletions(博弈 + SG函数打表)

    Digital Deletions 思路 一道博弈论的题目,考虑到题目所给的范围是字符长度为1−>61-> 61−>6,所以我们可以考虑暴力打表出10610 ^ 6106内的所有状态 ...

最新文章

  1. 笔录软件在linux系统,Linux下查看已安装软件
  2. SharePoint Application Page启用匿名访问
  3. 吃货莫跑小小程序冲刺07
  4. uva 816(经典bfs例子)
  5. cursor 过滤 android,Android cursor query方法详解
  6. Happy Valentine's Day
  7. flutter 获取定位_定位Flutter内存问题如何做
  8. pm2 简介与常用指令
  9. 蓝图出炉:大家将能够利用英伟达技术打造自己的自动驾驶车辆
  10. 《Redis开发与运维》学习第六章
  11. Cterm里面自动发帖的Python脚本
  12. 服务器2008系统设置密码,win2008服务器设置密码
  13. 计算机系统盘怎么扩充,Win7如何给C盘扩容 Win7系统电脑C盘扩容的办法
  14. php strpos 区分大小写么?,PHP strpos() 函数
  15. 论成长型思维的重要性
  16. VS2013+Ceres编译教程 Win7系统
  17. 微信小程序7个步骤告诉你怎么投放广告位
  18. POSIX标准总体分析 执行调度 消息传递 调度参数 进程调度函数 关闭消息队列 得到消息队列参数 设置调度参数 时钟和定时器  时钟和定时器函数 消息传递函数 打开消息队列 设置消息队列参数
  19. 关于微信小程序反编译获取源码
  20. 手把手带你完成第一个 android 小程序(快递App)

热门文章

  1. 这些免费的网络工程师资源网站,收藏起来,一年省下好几个W
  2. C语言二进制换十进制(简单)
  3. WPS Office Expansion tool弹出问题,真·彻底解决
  4. XML、XML Schema及XSL的应用——信息组织实验报告
  5. RFID标签防伪造方法总结(物理方法)
  6. mkw, 360大牛全面解读PHP面试资源下载
  7. Qualcomm LTE Packets log 分析
  8. 基于单片机的智能门锁设计
  9. 基于微信的在线付费课程学习平台的设计与实现 毕业设计毕设参考
  10. Endnote: 如何批量修改文献类型