ArcTan

dfs
随笔 - 16, 文章 - 117, 评论 - 6, 引用 - 0
数据加载中……

poj 3922(2008 Beijing 组合博弈 构造数列)

http://poj.org/problem?id=3922

这个题解比较详细:
http://hi.baidu.com/huicpc0207/item/f11a06f36ecfe91484d278fd

disscus里说有比O(n)还低的DP方法,之前我也构造出来了,不过是不正确的。比O(n)低的DP方法???

问了问院长老师,希望她能给个比较好的算法哦哦哦

归纳、构造数列:根据k=1,k=2找到思路,找出必败态即可。
总结:
         1、多研究思考些有难度的数学问题,自己找到办法。
         2、复杂问题总是有简单办法的。
         3、难题代码实现一般很容易!

#include<stdio.h>
#include
<string.h>
#include
<math.h>
int a[1000005],r[1000005];
int solve(int n,int k)
{
    
int i,j,ans;
    a[
0]=0;r[0]=0;
    
for (i=1,j=0;i<=1000000;i++)
    {
        a[i]
=r[i-1]+1;
        
while (j+1<&& a[j+1]*<a[i])
            j
++;
        r[i]
=a[i]+r[j];
        
if (r[i]>=n)
            
break;
    }
    
if (a[i]==n)
        
return 0;
    
while (i>=1)
    {
        
if (n==a[i])
            
return a[i];
        
else
            
if (n>a[i])
                n
-=a[i];
        i
--;
    }
    
return ans;
}
int main()
{
    
int t,cas=0,n,k,ans;
    scanf(
"%d",&t);
    
while (t--)
    {
        scanf(
"%d%d",&n,&k);
        ans
=solve(n,k);
        printf(
"Case %d: ",++cas);
        
if (!ans)
            printf(
"lose\n");
        
else
            printf(
"%d\n",ans);
    }
    
return 0;
}

posted on 2012-06-12 11:36 wangs 阅读(325) 评论(0)  编辑 收藏 引用 所属分类: ACM-数学


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理