HDU 4664 Triangulation【博弈论】
一个平面上有n个点(一个凸多边形的顶点),每次可以连接一个平面上的两个点(不能和已经连接的边相交),如果平面上已经出现了一个三角形,则不能在这个平面上继续连接边了。
现在总共有N个平面,每个平面上都有若干点。(就是有N个相同的游戏同时进行了)。
想法很单纯,就是计算出每一个平面上游戏的sg函数值,然后求Nim和就哦了。
sg函数暴力求法:
一个平面上连接点时,不能连接已经有边的顶点,因为对方只需要再连接一次就可以组成一个三角形了。又所有的边不能相交,因此每连接一条边,就相当于把整个平面上的点划分成了两个部分,在接下来的游戏中,只能单独在两部分里面进行,相当于将一个游戏划分成了两个游戏。因此当前状态x的sg函数值就是两个子游戏的Nim和了。
即:sg(x) = mex{ sg(i)^sg(x-i-2) }
这样复杂度很高。但是这道题目有规律,在大数据的范围下,会出现循环,循环长度为34,因此只需要小数据暴力,大数据打表就哦了。
#include <cstdio>
#include <cstring>
typedef long long ll;
#define N 1002
bool vis[N];
int sg[N];
int a[] = {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));
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 a[x%34];
}
int main() {
memset(sg, -1, sizeof(sg));
for (int i=0; i<=100; i++) sg[i] = 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【博弈论】的更多相关文章
- hdu 4664 Triangulation 博弈论
看到这题时,当时还不会做,也没搞懂sg函数,于是狠狠的钻研了下博弈论,渐渐的知道了sg函数…… 现在在来做这题就很容易了,1A 打表容易发现在80左右的时候就出现循环节了 代码如下: #include ...
- HDU 4664 Triangulation(SG函数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4664 题意:给出一个n个点的凸包(不存在三点共线).每次可以选择两个点连线,但是任意两条线只能在顶点处 ...
- HDU 4664 Triangulation(2013多校6 1010题,博弈)
Triangulation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- hdu 4664 Triangulation(题意已在讨论版中说明)
题意: 给定n个平面(平面之间相互独立),每个平面上有一些点,并且构成凸集,C和D轮流选一个平面连接两个点画线段,并保证线段之间除了端点之外没有其它交点,当平面上出现一个完整的三角形之后此平面就不能继 ...
- HDU 5512 Meeting 博弈论
Meeting Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5512 ...
- hdu 4678 Mine 博弈论
这是一题简单的博弈论!! 所有的空白+边界的数字(个数为n)为一堆,容易推出其SG函数值为n%2+1: 其他所有的数字(个数为m)的SG值为m%2. 再就是用dfs将空白部分搜一下即可!(注意细节) ...
- hdu 4023 Game 博弈论
思路: 将15种分成5类: 1.1和2为一类: 2.3,4,5,6为一类: 3.7,8,9,10为一类: 4.11,12,13,14,15为一类: 5.15为一类. 比较各类的优先级,就会发现放置的顺 ...
- hdu 4701 Game 博弈论
思路: ▶ 设 win(i,x,y) 表示当前可以买的物品是 i,先手有 x 元,后 手有 y 元时,先手是否必胜 ▶ win(i,x,y) ⇐⇒∃j((j > i)∧(x ≥ si−sj)∧¬ ...
- hdu 3389 Game 博弈论
思路: 其本质为阶梯博弈; 阶梯博弈:博弈在一列阶梯上进行,每个阶梯上放着自然数个点,两个人进行阶梯博弈... 每一步则是将一个集体上的若干个点( >=1 )移到前面去,最后没有点可以移 ...
随机推荐
- NetworkManager——Linux强大的网络管理工具
NetworkManager服务:NetworkManager - Linux Networking made Easy NetworkManager简介:NetworkManager由一个管理系统网 ...
- 异步方式向WPF ListBox控件中一条一条添加记录
向ListBox绑定数据源时,如果数据量过大,可能会使得程序卡死,这是就需要一条一条的向ListBox的数据源中添加记录了,下面是个小Demo: 1.前台代码,就是一个ListBox控件 <Wi ...
- openjpa框架入门_项目框架搭建(二)
Openjpa2.2+Mysql+Maven+Servlet+JSP 首先说明几点,让大家更清楚整体结构: 官方source code 下载:http://openjpa.apache.org/dow ...
- 在esx上 docker的网络桥接
docker:/root# docker run -itd --net=none --name zjtest8_haproxy 192.168.32.150:5000/zjzc_centos6.5_m ...
- Linux下利用fork()创建子进程并使父进程等待子进程结束
int status; pid_t t = fork(); if(t){ waitpid(t, &status, 0); }else{ system("vi temp ...
- BZOJ 3237([Ahoi2013]连通图-cdq图重构-连通性缩点)
3237: [Ahoi2013]连通图 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 106 Solved: 31 [ Submit][ St ...
- #include <limits.h>
limits.h专门用于检测整型数据数据类型的表达值范围. #include<stdio.h> #include<limits.h> main() { printf(" ...
- iOS开发之GCD使用总结
GCD是iOS的一种底层多线程机制,今天总结一下GCD的常用API和概念,希望对大家的学习起到帮助作用. GCD队列的概念 在多线程开发当中,程序员只要将想做的事情定义好,并追加到DispatchQu ...
- C# DataTable几个常用的查询表达式【转】
DataTable dt = GetDetails().Tables[0]; //获取可用的DataTable // var m = dt.AsEnumerable().Last ...
- 略谈cpu架构种类
一直对x86/i386/i686/x86_64这些东西感觉很不清楚,查些资料,解决部分问题,小记一番. Question1:什么是x86? x86或80x86是英特尔Intel首先开发制造的一种微处理 ...