注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

那一日,泪水打湿雪花冰冷的心

曾经的滋味,回忆在一次次的离合中,回眸时,那一刻,如涟漪般在一刹那融化

 
 
 

日志

 
 

sgu 429  

2010-10-31 15:45:21|  分类: sgu |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
给定n堆石子,每次只能从两端取石子,问先手必胜还是必输
令l[i][j]为从i到第j堆石子,第i堆为l[i][j]时此状态必输,同理有r[i][j]
设a=l[i][j-1],b=r[i+1][j],x=a[j],假设a>=b
如果x>a或x<b有l[i][j]=x
x=b有l[i][j]=0
b<x<=a有l[i][j]=x-1
注意到必输态[i][j]每行每列只有一个必输态(因为如果有两个,那么其中一个可以转移到另一个则不是必输态)上面的式子不难得出
同理可得到r[i][j],然后判断初始状态是否是必输态即可
#include<cstdio>
#include<cstring>
void pp(int i){
if(i)
printf("FEDOR\n");
else printf("SERGEY\n");
}
int n,a[10],l[10][10],r[10][10];
int main(){
scanf("%d",&n);
for(int i=0;i<n;++i)
scanf("%d",&a[i]);
if(n==1){
pp(a[0]);
return 0;
}
if(n==2){
pp(a[0]^a[1]);
return 0;
}
for(int i=0;i<n-1;++i){
l[i][1]=a[i+1];
r[i][1]=a[i];
}
for(int i=2;i<n;++i)
for(int j=0;j+i<n;++j){
int a1=l[j][i-1];
int a2=r[j+1][i-1];
int x=a[j+i];
if(a1>=a2){
if(x<a2||x>a1)
l[j][i]=x;
else if(x<=a1&&x>a2)
l[j][i]=x-1;
else l[j][i]=0;
}else{
if(x<a1||x>a2)
l[j][i]=x;
else if(x>=a1&&x<a2)
l[j][i]=x+1;
else l[j][i]=0;
}
a1=l[j][i-1];
a2=r[j+1][i-1];
x=a[j];
if(a1>=a2){
if(x<a2||x>a1)
r[j][i]=x;
else if(x<a1&&x>=a2)
r[j][i]=x+1;
else r[j][i]=0;
}else{
if(x<a1||x>a2)
r[j][i]=x;
else if(x>a1&&x<=a2)
r[j][i]=x-1;
else r[j][i]=0;
}
}
if(l[0][n-1]==a[0]||r[0][n-1]==a[n-1])
pp(0);
else pp(1);
return 0;
}
  评论这张
 
阅读(1057)| 评论(6)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018