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 ...
随机推荐
- git与GitHub(一)
相信,很多初入前端者都会对git以及GitHub不太了解,而我当时也经历过各种面试大关,也都会问:你了解git和GitHub吗?那么今天先来说一说git. 那么什么是git? (以下转载自廖雪峰老师的 ...
- js对象引用赋值后
a={f:1} b={} b.a=a console.log(b.a) a.b=2 console.log(b.a) a={f:1} b={} b.a=a console.log(b.a) a={b: ...
- CF1080D Olya and magical square
思路: 构造. 实现: #include <bits/stdc++.h> using namespace std; typedef long long ll; ll sum[]; int ...
- spark常用参数
val conf = new SparkConf().setAppName("WordCount_groupBy").setMaster("local") // ...
- awk累加
{a+=substr($14,1,1)}END{a=(a=="")?0:a;print a}' 对a进行累加,如果最后a=0的话,结果为0,否则为a,最后输出a
- JS 字符串 时间 数字函数操作 事件
字符串 操作 var s="abcdefg" s.tolowerCase() 转小写 s.toupperCase() 转大写 s.substring(2,5) 索引下 ...
- MySQL 导出一句话
听说是很老的东西了,学习的时候发现还是很好用的,故学习转载过来,留备学习. mysql 导出一句话 方法1:网上流行的方法 流程:(1)建表--->(2)插入数据--->(3)select ...
- Gym 100425A Luggage Distribution (组合数学,二分)
一开始想着球盒模型,数据范围大,递推会GG. 用凑的方法来算方案.往n个小球之间插两个隔板,方案是(n-1)*(n-2)/2,不区分盒子,三个盒子小球数各不相同的方案数被算了6次(做排列), 两个相同 ...
- "Uncaught SyntaxError: Unexpected token <"错误完美解决
今天写代码的时候发现了"Uncaught SyntaxError: Unexpected token <" <html>的js错误,而且还是html的第一行,我就 ...
- int型除以int型
int型除以int型得到的还是int型 就算你是这样的:float a = 5/3,虽然你定义的a是float型,但a得到的结果依旧是1.0000而不是1.66666 5/3先得到1,然后再转换成1. ...