HDU-2149(博弈)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2149

Public Sale

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 11335    Accepted Submission(s): 6708


 

Problem Description

虽然不想,但是现实总归是现实,Lele始终没有逃过退学的命运,因为他没有拿到奖学金。现在等待他的,就是像FarmJohn一样的农田生涯。

要种田得有田才行,Lele听说街上正在举行一场别开生面的拍卖会,拍卖的物品正好就是一块20亩的田地。于是,Lele带上他的全部积蓄,冲往拍卖会。

后来发现,整个拍卖会只有Lele和他的死对头Yueyue。

通过打听,Lele知道这场拍卖的规则是这样的:刚开始底价为0,两个人轮流开始加价,不过每次加价的幅度要在1~N之间,当价格大于或等于田地的成本价 M 时,主办方就把这块田地卖给这次叫价的人。

Lele和Yueyue虽然考试不行,但是对拍卖却十分精通,而且他们两个人都十分想得到这块田地。所以他们每次都是选对自己最有利的方式进行加价。

由于Lele字典序比Yueyue靠前,所以每次都是由Lele先开始加价,请问,第一次加价的时候,
Lele要出多少才能保证自己买得到这块地呢?

 

 

Input

本题目包含多组测试,请处理到文件结束(EOF)。每组测试占一行。
每组测试包含两个整数M和N(含义见题目描述,0<N,M<1100)

 

 

Output

对于每组数据,在一行里按递增的顺序输出Lele第一次可以加的价。两个数据之间用空格隔开。
如果Lele在第一次无论如何出价都无法买到这块土地,就输出"none"。

 

 

Sample Input

4 2

3 2

3 5

 

Sample Output

1

none

3 4 5

题目大意:给你一个成本价为M, 然后两个人按顺序叫价,但每次叫价增加的价格必须在(1~N)之间,最后谁报的的价先超过或等于M,谁就赢。两个人都很聪明,主角先叫价,问他第一次报价为多少时可以赢,如果能赢把他第一次报价的所有能赢的价格都输出来,如果没有赢的可能性就输出none。

 

解题思路:典型的博弈,如果对博弈一点都不了解,只是单纯找规律,做起来会很恼火。这道题就是巴什博奕,就相当于有M个物品,两个人轮流取,每次只能去(1~n)个。谁能先取完,谁就赢。这里有个公式M=(n+1)r+s,只要第一个人能取走s个,后手无论怎么取,比如k个(k<n)。那么先手只需要去(n+1-k)个。这样下去先手一定是第一个取完M的,这就是先手必胜,反之如果M与n+1取余为0,先手必败。这道题稍微又多了一点变化,n可以大于M,这种情况需要特判一下, 这也是先手必胜的情况只需要输出(M~N)就行了。输出所有能赢的价格就是保证你第一次报价后剩下的价格必须保证是(n+1)的倍数,就ok了,就这一点变化。

AC代码:

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

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值