• Alice and Bob(不断补充)


    我之前做过一些博弈的题目,以为博弈都是DP,结果被坑了很多次,其实博弈有很多种,在此,把我见过的类型都搬上来。

    1,HDU3951(找规律)

    题意:把n枚硬币围成一个圆,让Alice和Bob两个人分别每人每次拿k(1<=k<=m)枚连续的硬币,谁能拿到最后谁赢;

    思路:找规律,A拿了之后,B只要把剩下的分成偶数块,B就能赢,找到的规律就是除了m=1 && n&1是A赢,其余全是B赢,即B能够分成偶数块;

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <sstream>
     4 #include <cmath>
     5 #include <cstring>
     6 #include <cstdlib>
     7 #include <string>
     8 #include <vector>
     9 #include <map>
    10 #include <set>
    11 #include <queue>
    12 #include <stack>
    13 #include <algorithm>
    14 using namespace std;
    15 #define ll long long
    16 #define _cle(m, a) memset(m, a, sizeof(m))
    17 #define repu(i, a, b) for(int i = a; i < b; i++)
    18 #define MAXN 30005
    19 
    20 int main()
    21 {
    22    int T;
    23     scanf("%d", &T);
    24     for(int kase = 1; kase <= T; kase++)
    25     {
    26         int a, b; scanf("%d%d", &a, &b);
    27 
    28         if((a%2 && b==1) || a<=b) printf("Case %d: first
    ", kase);
    29         else
    30         {
    31             printf("Case %d: second
    ", kase);
    32         }
    33 
    34     }
    35    return 0;
    36 }
    View Code

    2,JOJ 1063(找规律)

    题意:1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完,以后每次取的石子数不能超过上次取子数的2倍。取完者胜.

    思路:找规律,如果牌数在数组中出现过就是Bob赢,a[i] = a[i-1] + a[1-2],其中a[0] = 2,a[1] = 3;

     1 const int N = 51;
     2 double arr[N] = {2, 3};
     3 int main(void)
     4 {
     5     int i;
     6     double n;
     7     for( i=2; i < N; ++i ) arr[i] = arr[i-1] + arr[i-2];
     8     while( scanf("%lf", &n), n != 0 )
     9     {
    10         for( i=0; i < N; ++i )
    11             if( arr[i] == n )
    12             {
    13                 printf("Second win
    ");
    14                 break;
    15             }
    16         if( i == N ) printf("First win
    ");
    17     }
    18     return 0;
    19 }
    代码

    3,HDU4597(记忆化搜索)

    题意:给出2叠卡片,每叠卡片有n张牌,告诉你卡片上的数字,每个人每次只能选择2叠卡片中最上边或者最下边的卡片,然后累加,最后谁得到的数字最大谁就能赢;

    思路:记忆化搜索

    dp[l1][r1][l2][r2]表示在pile1的数还剩下从l1到r1(开区间),pile2的数还剩下bl到r2的情况下,先手能取得的最大值。状态转移就最多只有四个方向,如果取pile1的左边那个数,那能获得的最大价值就是,

    即dp[l1-1][r1][l2][r2] = a[l1+1] + (suma[r1-1]-suma[l1+1]+sumb[r2-1]-sumb[l2]-dp[l1+1][r1][l2][r2])(预处理出pile1的和pile2的前缀和,用剩下的价值减去后手能获得的最大价值),然后记忆化搜索.

    View Code

     

  • 相关阅读:
    一个极好的ALV例子
    ABAP中读取文本文件(TXT DOCUMENT)并用ALV显示
    SMARTFORM报表程序设计(3)
    FOR ALL ENTRIES IN
    SMARTFORM报表程序设计(2)
    SMARTFORM报表程序设计(1)
    ABAP用FILE_OPEN_DIALOG打开多个文件后打印出名称
    LaTeX 表格的处理 [转]
    ubuntu安装deb,rpm安装包,tar.gz的方法 [转]
    OpenGL学习入门之VS2010环境配置 [转]
  • 原文地址:https://www.cnblogs.com/ACMERY/p/4485860.html
Copyright © 2020-2023  润新知