【hdu2149】Public Sale

其实这道题本质上也是取石子问题,那么我们还是可以用博弈论来解决。

首先还是特判,若(n>=m)直接输出从n到m的所有整数即可。

然后作进一步分析,可以看到如果目前的竞价是m-(n+1),也就是说离m还有n+1的距离,那么此时轮到竞拍的人必输,所以要尽量给对手这样的点。

同样的,当i*(n+1)<m<(i+1)*(n+1)时,轮到竞价的人必定能赢得竞拍,此时第一次出价也仅有一种出价方法,即出价(m-i*(n+1));而当存在i*(n+1)== m时,必败,输出none。

其实代码和取石子问题差不多:

#include<cstdio>
int main()
{
    int n,m;
    while(~scanf("%d %d",&m,&n))
    {
        if(n>=m)
        {
            for(int i=m;i<n;i++)
            printf("%d ",i);
            printf("%d\n",n);
            continue;
        }
        for(int i=1;;i++)
        {
            if(i*(n+1)<m&&m<(i+1)*(n+1)){printf("%d\n",m-i*(n+1));break;}
            else if(i*(n+1)==m){printf("none\n");break;}
        }
    }
    return 0;
}
View Code

 

posted @ 2017-06-06 23:11  Child-Single  阅读(146)  评论(0编辑  收藏  举报