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 ...
随机推荐
- 【学习笔记】六:面向对象的程序设计——理解JS中的对象属性、创建对象、JS中的继承
ES中没有类的概念,这也使其对象和其他语言中的对象有所不同,ES中定义对象为:“无序属性的集合,其属性包含基本值.对象或者函数”.现在常用的创建单个对象的方法为对象字面量形式.在常见多个对象时,使用工 ...
- Wrapper class package.jaxws.methodName is not found. Have you run APT to generate them?解决方案
使用JAX-WS 2.X基于Web容器发布WebService报错,错误信息类似于: Wrapper class package.jaxws.methodName is not found. Have ...
- Android项目中包名的修改
通常修改包名时会造成R文件错误,并且有时带有原因不明的Manifest文件中多处文本混乱. 所以,将目前认为最为简洁方便的修改包名流程记录如下: 假设我们目前的包名为com.pepper.util,我 ...
- Linux下的I/O复用
读书笔记 I/O复用使得程序能同时监听多个文件描述符,这对提高程序的性能至关重要. Linux下实现I/O复用的系统调用主要有select, poll, epoll. select: 用户通过3个参数 ...
- html页面编码问题
今天在项目中碰到需要把已经编码的html页面通过mvc controller返回到前端页面,已编码的html页面包含类似下面的内容: <div style="line-height: ...
- iPhone Tutorials
http://www.raywenderlich.com/tutorials This site contains a ton of fun written tutorials – so many t ...
- python matplotlib 可视化操作实例
具体代码: # encoding: utf-8 # coding = utf-8 import sys reload(sys) sys.setdefaultencoding('utf8') from ...
- struts1标签库
Struts提供了五个标签库,即:HTML.Bean.Logic.Template和Nested. HTML标签 : 用来创建能够和Struts 框架和其他相应的HTML 标签交互的HTML 输入表单 ...
- vsftp配置日志及其启用本地时间
vsftp配置日志及其启用本地时间 1. 启用vsftp日志 xferlog_enable=YES xferlog_std_format=YES xferlog_file=/var/log/xferl ...
- ECMAScript 继承机制实现
继承机制的实现 要用 ECMAScript 实现继承机制,您可以从要继承的基类入手.所有开发者定义的类都可作为基类.出于安全原因,本地类和宿主类不能作为基类,这样可以防止公用访问编译过的浏览器级的代码 ...