hdu2177----取(2堆)石子游戏

威佐夫博弈博弈论 直接模拟即可 值得一提的是这道题几乎网上所有题解都没有考虑只从小堆取得情况 所以在类似 19 20这种数据出现时,他们都是错误的 只输出了 1 2 而没有 12 20

 1 #include <cstdio>
 2
 3 #include <cmath>
 4
 5 #include <map>
 6
 7 #include <string.h>
 8
 9 #define inf 0x3f3f3f3f
10
11 const int maxn=1000000;
12
13 using namespace std;
14
15 int a,b;
16
17 bool judge(int a,int b){
18
19    return a==(int)((b-a)*(sqrt(5.0)+1)/2);
20 }
21
22 int main()
23 {
24     while(scanf("%d%d",&a,&b)!=EOF&&(a||b)){
25         map<int,int> flag;
26         if(judge(a,b)){
27                 printf("0\n");
28         } else {
29           printf("1\n");
30           for(int i=0,j=0;i<=a;i++){
31                 if(!flag[i]&&!flag[i+j]){
32                // printf("%d %d\n",i,i+j);
33                 flag[i]=flag[i+j]=1;
34                 if(a-i==b-i-j&&a>i&&b>i+j)
35                 printf("%d %d\n",i,i+j);
36                 /*else if((a==i+j&&b>i)||(a==i&&i+j<b)||(b==i+j&&a>i)) printf("%d %d\n",i,i+j);*/
37                 j++;
38                 }
39         }
40         flag.clear();
41         for(int i=0,j=0;i<=a;i++){
42                 if(!flag[i]&&!flag[i+j]){
43                // printf("%d %d\n",i,i+j);
44                 flag[i]=flag[i+j]=1;
45                /* if(a-i==b-i-j&&a>i&&b>i+j)
46                 printf("%d %d\n",i,i+j);*/
47                 if((a==i+j&&b>i)||(a==i&&i+j<b)||(b==i+j&&a>i)) printf("%d %d\n",i,i+j);
48                 j++;
49                 }
50         }
51         }
52     }
53     return 0;
54 }

这道题提醒我们,网上看题解,不管多大的大牛写的,也一定要带上自己的思考。

时间: 2024-08-02 22:20:31

hdu2177----取(2堆)石子游戏的相关文章

HDU2177 取(2堆)石子游戏(威佐夫博弈)

HDU2177 取(2堆)石子游戏 Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者.现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者.如果你胜,你第1次怎样取子? Input 输入包含若干行,表示若干种石子的初始情况,其中每一行包含两个非负整数a和b,表示两堆石

hdu2177 取(2堆)石子游戏 (威佐夫博弈)

取(2堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2054    Accepted Submission(s): 1238 Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走

hdu2177取(2堆)石子游戏

取(2堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1315    Accepted Submission(s): 777 Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相

ACM-威佐夫博弈之取(2堆)石子游戏——hdu2177

取(2堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 932    Accepted Submission(s): 557 Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同

取(2堆)石子游戏(威佐夫博弈+hdu2177)

T - 取(2堆)石子游戏 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2177 Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者.现在给出初始的两堆石子的数目,

HDU 2176 取(m堆)石子游戏 博弈

取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3598    Accepted Submission(s): 2151 Problem Description m堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎样取子.例如5堆 5,7,8,9,10先取者胜,先取者第1次取

HDU 2176 取(m堆)石子游戏 (Nim博弈)

取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1937    Accepted Submission(s): 1115 Problem Description m堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎样取子.例如5堆 5,7,8,9,10先取者胜,先取者第1次取

杭电 2176 取(m堆)石子游戏(博弈)

取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1741    Accepted Submission(s): 1014 Problem Description m堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎样取子.例如5堆 5,7,8,9,10先取者胜,先取者第1次

hdu 2177 取(2堆)石子游戏

天资愚笨啊,网上的一大堆没看懂...... 总结百科的方法为: 1.a==b 同时减去a 得到0,0 2.a==a_k      b>b_k b -(b-b_k) 3.a==a_k     b<b_k 同时拿走a_k-a_(b-a_k) 得到 a_(b-a_k)    a_(b-a_k) + b-a_k 4.a>a_k       b==b_k 从a中拿走 a-a_k 5.a<a_k       b==b_k 5.1 a==a_ j   (j<k) b-(b-b_ j) 得到

ACM-尼姆博弈之取(m堆)石子游戏——hdu2176

取(m堆)石子游戏 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1486    Accepted Submission(s): 865 Problem Description m堆石子,两人轮流取.只能在1堆中取.取完者胜.先取者负输出No.先取者胜输出Yes,然后输出怎样取子.例如5堆 5,7,8,9,10先取者胜,先取者第1次取