hdu 1848 sg——dfs&&打表双实现
Fibonacci again and again
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6363 Accepted Submission(s): 2646
F(1)=1;
F(2)=2;
F(n)=F(n-1)+F(n-2)(n>=3);
所以,1,2,3,5,8,13……就是菲波那契数列。
在HDOJ上有不少相关的题目,比如1005 Fibonacci again就是曾经的浙江省赛题。
今天,又一个关于Fibonacci的题目出现了,它是一个小游戏,定义如下:
1、 这是一个二人游戏;
2、 一共有3堆石子,数量分别是m, n, p个;
3、 两人轮流走;
4、 每走一步可以选择任意一堆石子,然后取走f个;
5、 f只能是菲波那契数列中的元素(即每次只能取1,2,3,5,8…等数量);
6、 最先取光所有石子的人为胜者;
假设双方都使用最优策略,请判断先手的人会赢还是后手的人会赢。
m=n=p=0则表示输入结束。
1 4 1
0 0 0
Nacci
- //f[]:可以取走的石子个数
- //sg[]:0~n的SG函数值
- //Hash[]:mex{}
- #include<stdio.h>
- #include<string.h>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- const int N=;
- const int K=;
- int f[K],sg[N],Hash[N];
- int k;
- void getSG(int n)
- {
- memset(sg,,sizeof(sg));
- for(int i=; i<=n; i++) {
- memset(Hash,,sizeof(Hash));
- for(int j=; f[j]<=i && j < k; j++) //k是f[]的有效长度
- Hash[sg[i-f[j]]]=;
- for(int j=; ; j++) { //求mes{}中未出现的最小的非负整数
- if(Hash[j]==) {
- sg[i]=j;
- break;
- }
- }
- }
- }
- int main(){
- int x1,x2,x3;
- f[]=;
- f[]=;
- for(int i=;i<=;i++)
- f[i]=f[i-]+f[i-];
- k=;
- getSG();
- while(scanf("%d%d%d",&x1,&x2,&x3)!=EOF){
- if(x1==&&x2==&&x3==)
- break;
- int ans;
- ans=sg[x1]^sg[x2]^sg[x3];
- if(ans)
- printf("Fibo\n");
- else
- printf("Nacci\n");
- }
- return ;
- }
上面的打表的代码,下面附上dfs代码
15087133 | 2015-10-12 20:11:06 | Accepted | 1848 | 109MS | 1880K | 1060 B | C++ | 牟柏旭 |
- #include<stdio.h>
- #include<iostream>
- #include<string.h>
- #include<algorithm>
- using namespace std;
- const int k=;
- int s[],sg[];
- int getsg(int m)
- {
- int hash[]={};
- int i;
- for(i=;i<k;i++){
- if(m-s[i]<)
- break;
- if(sg[m-s[i]]==-)
- sg[m-s[i]]=getsg(m-s[i]);
- hash[sg[m-s[i]]]=;
- }
- for(i=;;i++)
- if(hash[i]==)
- return i;
- }
- int main()
- {
- int x[];
- s[]=;
- s[]=;
- for(int i=;i<;i++)
- s[i]=s[i-]+s[i-];
- while(scanf("%d%d%d",&x[],&x[],&x[])!=EOF)
- {
- if(x[]==&&x[]==&&x[]==)
- break;
- int i;
- memset(sg,-,sizeof(sg));
- sg[]=;
- int ans=;
- for(int i=;i<=;i++){
- if(sg[x[i]]==-)
- sg[x[i]]=getsg(x[i]);
- ans^=sg[x[i]];
- }
- if(ans)
- cout<<"Fibo"<<endl;
- else cout<<"Nacci"<<endl;
- }
- return ;
- }
15087680 | 2015-10-12 20:35:01 | Accepted | 1848 | 140MS | 1772K | 1384B | C++ | 牟柏旭 |
- #include<cstdio>
- #include<string.h>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- const int N=;
- int knum;
- int si[N],sg[];
- int mex(int x)//求x的sg值(可作为模版应用)
- {
- if(sg[x]!=-)
- return sg[x];
- bool vis[N];
- memset(vis,false,sizeof(vis));
- for(int i=;i<knum;i++) {
- int temp=x-si[i];
- if(temp<)
- break;
- sg[temp]=mex(temp);
- vis[sg[temp]]=true;
- }
- for(int i=;i<;i++) {
- if(!vis[i]) {
- sg[x]=i;
- break;
- }
- }
- return sg[x];
- }
- int main() {
- int x[];
- while(scanf("%d%d%d",&x[],&x[],&x[])!=EOF) {
- if(x[]==&&x[]==&&x[]==)
- break;
- si[]=;
- si[]=;
- for(int i=;i<;i++)
- si[i]=si[i-]+si[i-];
- knum=;
- memset(sg,-,sizeof(sg));
- sg[]=;
- int ans=;
- for(int j=;j<=;j++) {
- ans^=mex(x[j]);//尼姆博弈
- }
- if(ans==)
- printf("Nacci\n");
- else
- printf("Fibo\n");
- }
- return ;
- }
hdu 1848 sg——dfs&&打表双实现的更多相关文章
- hdu 2147 SG函数打表(手写也可以) 找规律
kiki's game Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 40000/1000 K (Java/Others) Total ...
- HDU 1848 SG函数博弈
Fibonacci again and again Problem Description 任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的:F(1 ...
- hdu 1848(SG函数)
Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- hdu 1536 sg (dfs实现)
S-Nim Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- SG函数入门&&HDU 1848
SG函数 sg[i]为0表示i节点先手必败. 首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数.例如mex{0,1,2,4}=3. ...
- hdu 1848 Fibonacci again and again(SG函数)
Fibonacci again and again HDU - 1848 任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的: F(1)=1; F(2)= ...
- HDU 2586 How far away(dfs+邻接表)
How far away [题目链接]How far away [题目类型]dfs+邻接表 &题意: 题目大意:一个村子里有n个房子,这n个房子用n-1条路连接起来,接下了有m次询问,每次询问 ...
- HDU 2563 统计问题 (DFS + 打表)
统计问题 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- hdu1848(sg函数打表)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1848 题意:中文题诶- 思路:直接sg函数打表就好了 代码: #include <iostrea ...
随机推荐
- 访问者模式和php实现
访问者模式: 表示作用于某个对象结构中的各个元素的操作.它使你可以在不改变各个元素类的前提下定义作用于这些元素的操作. 角色: 1)抽象访问者:为该对象结构中具体元素角色声明一个访问操作接口.该操作接 ...
- 快速搭建一个Fabric 1.0的环境(转)
文章来源:http://www.cnblogs.com/studyzy/p/7437157.html 感谢博主@深蓝居 提供的技术文档,按照文档根据自己遇到的问题做了一定修改,方便自己回顾和再次搭建 ...
- 《深入理解JavaScript闭包和原型》笔记
By XFE-堪玉 以下知识来源于对王福朋所写<深入理解javascript原型和闭包>的理解和整理 一切都是对象[引用类型],对象都是通过函数创建的[Funcion类型] 对象是属性的集 ...
- Android.mk模板
此文列出Android.mk的常用模板(部分内容源于多篇他人博客,这里不具体指出),如有错漏,还请在评论中指出,后期持续更新 #链接第三方动态库,在和部分android源码的编译中验证不过 LOC ...
- make与makefile的几个例子和(自己写一下,汗!忘记了!)总结
共用的几个源代码文件: main.c 2.c 3.c 代码依次为: #include<stdlib.h> #include "a.h" extern void func ...
- HDU 4341 Gold miner (分组背包)
先把线按照距离原点的距离排序,然后用叉积把在同一条直线上的点放在一起, 把在同一条线上的点中的前i个点当成一个点就转化成了分组背包. 写if(kas++) putchar('\n') 居然PE了,PE ...
- 使用vue做移动端瀑布流分页
讲到瀑布流分页有一个方法一定是要用到的 pullToRefresh() 这个也没什么好解释的,想了解的可以去百度一下 下面上代码 <div id="main" class=& ...
- jquery插件serializeFormToObject
$.fn.serializeObject = function() { var o = {}; var a = this.serializeArray(); $.each(a, function() ...
- 浅谈web前端开发
我个人认为前端攻城狮其实就是编程技术人员,用一句话来形容“比UI设计懂技术,比技术人员更懂交互”,当然也有人说前端工程师是工程师中的设计师,是设计师中的工程师. 好了废话不多说了,下面进入正题吧! ...
- Burpsuite1.7.03网站渗透神器最新破解版
众所周知,Burp Suite是响当当的web应用程序渗透测试集成平台.从应用程序攻击表面的最初映射和分析, 到寻找和利用安全漏洞等过程,所有工具为支持整体测试程序而无缝地在一起工作. 平台中所有工具 ...