Wpremig的AH之战题解

题目
AH是auction house,拍卖行的缩写。众所周知,为了道具流通,基本上每个网络游戏都会有拍卖行或者类似拍卖行的系统存在。

Wpremig最近喜欢上玩《XX传奇》,游戏为了吸引玩家,推出了一种"抢拍模式",在原有的拍卖行竞价基础上,增加了一条规则:只有最早竞价的两个人有资格竞价。

原本规则如下:

所有物品初始价格为0, 每次加价必须在[1,N]内,并且不存在一口价功能,只有一个价格上限M,当某次某个玩家加价后的价格大于等于M时,这个玩家就可以拍下物品,或者在48小时后还没有超出上限,那么当前出价人拍下物品。

Wpremig通过内部消息知道明天会拍卖一件神器,并且找到了一个脚本软件,能保证自己一定是第一个竞价的人,但是现在他的几个不同的消息来源,给出的物品价格是不一样的,所以他并不知道到时候神器的准确价格是多少,但是可以知道一点,另一个玩家一定不会在中途放弃。

所以Wpremig想要知道对于每种N,M的情况,自己一开始出价多少才能够保证自己拍到这件物品?


本题题目比较长,刚开始不明白想要考什么,经过了反复读题后才知道最核心就是考一个取石子的游戏(nyoj23-取石子(一)

巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。

  • 原理:显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。

如果 n=k(m-1)则后取者胜,反之则存在先取者获胜的方法。
因此如果n%(m-1)==0,先取者必败。否则先取者应该取n%(m-1)个。

实现如下

#include <stdio.h>
int main() {
    int n,m;
    while(~scanf("%d %d",&n,&m)){
        if(n>m){
            for(int i=m;i<=n;i++)
                printf("%d ",i);
            printf("\n");
        } 
        else {
            if(m%(n+1)==0)
                printf("You are loser\n");
            else
                printf("%d\n",m%(n+1));
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43301061/article/details/85344951