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 ...
随机推荐
- leetcode542 01 Matrix
思路: 多个起点的bfs. 实现: class Solution { public: vector<vector<int>> updateMatrix(vector<ve ...
- Sass基本特性
Sass扩展/继承@extend 代码的继承,声明方式:.class;调用方式:@extend 如: .btn { border: 1px solid #ccc; padding: 6px 10px; ...
- VC运行时库(/MD、/MT等)
VC项目属性→配置属性→C/C++→代码生成→运行时库 可以采用的方式有:多线程(/MT).多线程调试(/MTd).多线程DLL(/MD).多线程调试DLL(/MDd).单线程(/ML).单线程调试( ...
- xp密钥
Windows XP 专业版 : CCC64-69Q48-Y3KWW-8V9GV-TVKRM
- Memcache笔记01-Memcache的安装
memcached是什么? Memcached是一个高性能的分布式的内存对象缓存系统,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力,通过在内存里维护一个统一的巨大的has ...
- 洛谷 P2936 [USACO09JAN]全流Total Flow
题目描述 Farmer John always wants his cows to have enough water and thus has made a map of the N (1 < ...
- 使用python模拟登陆百度
#!/usr/bin/python # -*- coding: utf- -*- """ Function: Used to demostrate how to use ...
- 单源最短路Dijstra
#include<iostream> #include<cstring> #define INF 0x3f3f3f3f using namespace std; ][],d[] ...
- 解决response在controller返回乱码的解决方式
乱码的代码 @RequestMapping(value = "/readbook", method = RequestMethod.GET) 加入 produces = " ...
- 屏蔽系统的Ctrl+c/x/v操作
实现效果: 知识运用: KeyEventArgs类的Control, public bool Control {get;} //获取一个值 该值指示是否曾按下Ctrl键 KeyCode和Handled ...