• C. Even Number Addicts


    Problem - C - Codeforces

    题意是给你一串序列,每个人轮流,如果Alice最后的总和是偶数就赢,不然Alice最后的总和是奇数就输,Bob就赢,问最后谁赢了

    博弈论

    我感觉博弈论有点难懂,然后专门问了一下大佬。

    要分清楚必胜和必输的状态

    本题来看

    A的本质是想让自己赢,所以她需要偶数

    B的本质是想让自己赢,所以他需要A是奇数

    对于一个数来说,加上一个偶数对这个数的奇偶性没有任何的影响,加上一个奇数会改变这个数的奇偶性。

    所以来分析一下:

    如果此时的A选了一个偶数,那B必定也选偶数,因为B想把奇数留下让A选,改变A的奇偶性

    如果此时的A选了一个奇数,那B必定也选奇数,因为B想把偶数留下让A选,不改变A的奇偶性

    那么此时就好选了,因为奇数和偶数完全可以分开选了

    看到别人的思路:

    以4个奇数或者偶数为一组

    比如以4个奇数为一组,那一组数中的偶数就是n-奇数

    ①(奇数的数量%4==0) :先手必胜

    不管这里先选偶数还是先选奇数,偶数选完选奇数或者奇数选完选偶数,偶数没啥影响不用在意个数,现在奇数是4的整数倍,那必定分到一半的奇数到A,所以A必胜

    ②(奇数的数量%4==1):分类讨论

    这里不知道多出来的奇数会分配到A的上面还是B的上面

    所以要分类讨论:

    1)先手必输:如果n为奇数,此时偶数为偶数个,然后AB刚好可以分配完,所以多出来的奇数分配到A上面,那这种情况A是必输态

    2)先手必胜:如果n为偶数,此时偶数为奇数个,B少了一个,正好多余的这一个可以补上

    ③(奇数的数量%4==2):先手必输(各分配一个)

    ④(奇数的数量%4==3):先手必胜。A正好变成偶数

    下面就是代码了,看代码再理解理解:

    1. #pragma GCC optimize(1)
    2. #pragma GCC optimize(2)
    3. #pragma GCC optimize(3,"Ofast","inline")
    4. #define IOS ios::sync_with_stdio(false), cin.tie(0);
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include
    13. #include
    14. #include
    15. #include
    16. using namespace std;
    17. #define int long long
    18. typedef long long ll;
    19. typedef pair<int,int> PAII;
    20. const int N=2e6+10,M=5005,INF=1e18,mod=1e9+7;
    21. int a[N],b[N];
    22. signed main(){
    23. //IOS;
    24. int T;
    25. //T=1;
    26. cin>>T;
    27. while(T--)
    28. {
    29. int sum = 0;
    30. int n;
    31. cin>>n;
    32. for(int i=1;i<=n;i++)
    33. {
    34. int x;
    35. cin>>x;
    36. if(x&1) sum++;
    37. }
    38. if(sum % 4 == 0)
    39. {
    40. cout<<"Alice\n";
    41. continue;
    42. }
    43. if(sum % 4 == 1)//看看这个奇数是分配到谁的上面
    44. {
    45. if(n&1) cout<<"Bob\n";
    46. else cout<<"Alice\n";
    47. continue;
    48. }
    49. if(sum % 4 == 2)
    50. {
    51. cout<<"Bob\n";
    52. continue;
    53. }
    54. if(sum % 4 == 3)
    55. {
    56. cout<<"Alice\n";
    57. continue;
    58. }
    59. }
    60. return 0;
    61. }
    62. /*
    63. 博弈论
    64. 其实只有奇数才能发挥作用,偶数没有用
    65. */

  • 相关阅读:
    若依 springBoot2.5 +vue2前后端分离,实现图片上传及下载功能。
    【建造者设计模式详解】Java/JS/Go/Python/TS不同语言实现
    [PostgreSQL的 SPI_接口函数]
    VLAN多变一的业务场景解答
    一个产品经理回忆录
    js 面向对象
    图问题——深度遍历,广度遍历,并查集
    MM-Camera架构-Open 流程分析
    如何用 Zabbix 监控 Radius 服务?
    首款内置电源的迷你主机,不到千元的办公神器 | 零刻EQ13评测报告
  • 原文地址:https://blog.csdn.net/m0_63305704/article/details/127133918