SG函数题目
思路:
把整个游戏看成三个子游戏,然后求游戏的和
关键理解g(x) = mex(g(y), y€f(x)) , f(x)表示由x点可达的点,
import java.util.Arrays;
import java.util.Scanner; public class Main {
public int[] fib = new int[20];
public boolean[] vt = new boolean[20];
public static int[] g = new int[1002]; public void init() {
fib[1] = 1; fib[2] = 2;
for (int i = 3; i < 20; ++i) {
fib[i] = fib[i - 1] + fib[i - 2];
}
}
public void dfsSG() {
//首先找出确定的点一般为0点
g[0] = 0; g[1] = 1;
for (int i = 2; i <= 1000; ++i) {
Arrays.fill(vt, false);
//然后枚举g(y)标记, g(x) = mex(g(y), y 属于 F(x));
for (int j = 1; fib[j] <= i; ++j) {
vt[g[i - fib[j]]] = true;
}
//mex()过程
for (int j = 0; j <= 1000; ++j) {
if (!vt[j]) {
g[i] = j;
break;
}
}
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Main main = new Main();
main.init(); main.dfsSG();
int m, n, p;
while (in.hasNext()) {
m = in.nextInt();
n = in.nextInt();
p = in.nextInt();
if (m == 0 && n == 0 && p == 0) break;
if ((g[m] ^ g[n] ^ g[p]) != 0) {
System.out.println("Fibo");
} else {
System.out.println("Nacci");
}
}
}
}
思路:同上。。只是每一步的策略不同罢了。。
import java.util.Arrays;
import java.util.Scanner; public class Main {
public static Scanner in = new Scanner(System.in);
public static int[] s;
public static int[] g = new int[10001];
/*
* 注意vt的取值,我们只要的最大之只要是s的大小 + 1即可。
* 因为我们最后往后走k不,如果这k个得到的是0-k那么我们的取值就是k+1
* 这是最大的了
*/
public static boolean[] vt = new boolean[107]; public static int k;
public static void dfsSG() {
g[0] = 0;
for (int i = 1; i <= 10000; ++i) {
Arrays.fill(vt, false);
for (int j = 0; j < k; ++j) {
if (i - s[j] < 0) break;
vt[g[i - s[j]]] = true;
}
for (int j = 0; j <= 107; ++j) {
if (!vt[j]) {
g[i] = j;
break;
}
}
}
}
public static void main(String[] args) { while (in.hasNext()) {
k = in.nextInt();
if (k == 0) break;
s = new int[k];
for (int i = 0; i < k; ++i) s[i] = in.nextInt();
Arrays.sort(s);
dfsSG();
int m = in.nextInt();
while ((m--) != 0) {
int sz = in.nextInt();
int ans = 0;
for (int i = 0; i < sz; ++i) {
int idx = in.nextInt();
ans ^= g[idx];
}
if (ans == 0) {
System.out.print("L");
} else {
System.out.print("W");
}
}
System.out.println();
}
}
}
SG函数题目的更多相关文章
- BZOJ1188 [HNOI2007]分裂游戏(SG函数)
传送门 拿到这道题就知道是典型的博弈论,但是却不知道怎么设计它的SG函数.看了解析一类组合游戏这篇论文之后才知道这道题应该怎么做. 这道题需要奇特的模型转换.即把每一个石子当做一堆石子,且原来在第i堆 ...
- sg函数与博弈论
这个标题是不是看起来很厉害呢... 我们首先来看一个最简单的游戏.比如我现在有一堆石子,有p个,每次可以取走若干个(不能不取),不能取的人就输了. 现在假设有两个人要玩这个游戏,一个人先手,一个人后手 ...
- hdu1536&&hdu3023 SG函数模板及其运用
S-Nim Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u Submit Status ...
- HDU1848 Fibonacci again and again SG函数
Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- SG函数 专题练习
[hdu1536][poj2960]S-Nim 题意 题意就是给出一个数组h,为每次可以取石子的数目. 然后给你n堆石子每堆si.求解先手能不能赢? 分析 根据\(h\)数组预处理出\(sg[i]\) ...
- HDU 1848 Fibonacci again and again (斐波那契博弈SG函数)
Fibonacci again and again Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & ...
- hdu-------(1848)Fibonacci again and again(sg函数版的尼姆博弈)
Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- SG函数
入门一: 首先来玩个游戏,引用杭电课件上的: (1) 玩家:2人:(2) 道具:23张扑克牌:(3) 规则:游戏双方轮流取牌:每人每次仅限于取1张.2张或3张牌:扑克牌取光,则游戏结束:最后取牌的一方 ...
- hdoj 1729 Stone Games(SG函数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1729 看了题目感觉像Nim,但是有范围限制,有点不知道SG函数该怎么写 看了题解,最后才明白该怎么去理 ...
随机推荐
- 【jqGrid for ASP.NET MVC Documentation】.学习笔记.3.本地化语言包
1 引用本地化语言包 在 js/i18n 文件夹中,提供了大量预定义的语言包.它包括为所有字符串定义的,包括消息,标题,分页信息,搜索/添加/删除 的对话框 文本等. 在jQuery库文件后,在jqG ...
- weblogic的jar包冲突
异常: Error creating bean with name 'sessionFactoryWrite' defined in class path resource [applicationC ...
- 通达OA 指纹考勤机接口 源代码
通达oa2011已经支持 指纹考勤机 但只限中控iclock660 这款2000大洋的型号 通过本文的开发接口,可以与任意一款指纹机集成, 需求指纹机管理软件能实时保存数据 我这里用的是 中控u16 ...
- Asp.net mvc5 系列笔记
程序版本 vs 2015 1.0.0-beta4 ,得到你的肯定是我最大的动力. Asp.net Vnext 调试源码 Asp.net Vnext 自定义日志 Asp.net Vnext 中间件实 ...
- myeclipse 常用快捷键总结
1 shift+enter 不管鼠标在当前行的什么位置,重新开启一行(向下) 2 shift+ctrl+enter 不管鼠标在当前行的什么位置,重新开启一行(向上) 3 Ctrl+D 删除一行 ...
- java 编程时候的性能调优
一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util ...
- Android 5.1 - 状态栏充电标志问题
Android 5.1 Ubuntu14.04 SourceInsigh 电量已满,插着USB头,观察Settings - Battery,电量为100%,状态为full,但仍有充电图标rust 之 ...
- Java内部类、静态嵌套类、局部内部类、匿名内部类
Nested classes are further divided into two types: static nested classes: If the nested class is sta ...
- Removing Columns 分类: 贪心 CF 2015-08-08 16:10 10人阅读 评论(0) 收藏
Removing Columns time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- 第十二届浙江省大学生程序设计大赛-Capture the Flag 分类: 比赛 2015-06-26 14:35 10人阅读 评论(0) 收藏
Capture the Flag Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge In computer security, Ca ...