首页 > 其他分享 >(博弈论)Even Number Addicts

(博弈论)Even Number Addicts

时间:2023-06-14 17:34:01浏览次数:44  
标签:Even mod2 mod4 Addicts 奇数 Number Alice 偶数 Bob

Alice 和 Bob 正在一个序列 ai​ 上玩游戏,Alice 先手,轮流玩。每一轮当前玩家可以取走序列中任意一个数,直到取完。

如果最后 Ailce 取走的数的和为偶数,则 Ailce 赢,否则 Bob 赢。保证每个人用最优策略玩。对于每组数据,输出赢家。

输入输出样例

输入 #1
4
3
1 3 5
4
1 3 5 7
4
1 2 3 4
4
10 20 30 40
输出 #1
Alice
Alice
Bob
Alice

共识:奇数 + 奇数 = 偶数;奇数 + 偶数 = 奇数;偶数 + 偶数 = 偶数。

统计序列 a 中偶数 ai​ 和奇数 ai​ 分别出现的次数 e、o,依次可确定下列几种情况,决定二人胜负态:

  1. 当 ≡2(mod4)o≡2(mod4) 时, Bob 存在必胜态;

Bob 仅需保证每次所取数字与 Alice 所取数字奇偶性相同即可,这样可以使二者取走的奇数个数相同。若在此过程中 Alice 取走了最后一个偶数,奇数必然剩余偶个。随后,Alice 和 Bob 各自将选择剩余奇数的一半。最后,Alice 和 Bob 都拥有 22o​ 个奇数,Alice 和为奇数,Alice 败。

  1. 当 ≡3(mod4)o≡3(mod4) 时, Alice 存在必胜态;

Alice 首先选择一个奇数,若 Bob 能从剩下的数字中取走偶个奇数,则 Bob 胜。从情况 1 中可知,Bob 必败。

  1. 当 ≡0(mod4)o≡0(mod4) 时, Alice 存在必胜态;

Alice 首先选择一个偶数,在随后的操作中,Alice 仅需保证每次所取数字与 Bob 所取数字奇偶性相同即可,这样可以使二者取走的奇数个数相同。若在此过程中偶数被取完,奇数必然剩余偶个。随后,Alice 和 Bob 各自将选择剩余奇数的一半。最后,Alice 和 Bob 都拥有 22o​ 个奇数,Alice 和为偶数,Alice 胜。

  1. 当 ≡1(mod4)o≡1(mod4) 时,先选择奇数的人败。

先选择奇数的人将会导致对手出现情况 3,对手必胜。博弈开始时,如果 e 为偶即 ≡0(mod2)e≡0(mod2),则 Bob 将会取走最后一个偶数,Alice 败;e 为奇即 ≡1(mod2)e≡1(mod2),则 Alice 胜。

//https://www.luogu.com.cn/problem/CF1738C
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int num1,num2,n,res,t;
int main()
{
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            int a;
            cin>>a;
            if(a%2==0) num2++;
            else num1++;
        }
        if(num1%4==0||num1%4==3||(num1%4==1&&num2%2==1)) cout<<"Alice"<<endl;
        else cout<<"Bob"<<endl;
    }
    return 0;
}

 

标签:Even,mod2,mod4,Addicts,奇数,Number,Alice,偶数,Bob
From: https://www.cnblogs.com/o-Sakurajimamai-o/p/17480899.html

相关文章

  • eventfd
    参考:https://zhuanlan.zhihu.com/p/393748176inteventfd(unsignedintinitval,intflags);:对eventfd创建的文件描述符进行write和readuint64_tu1,u2,u3;//写eventfd,内部buffer必须是8字节大小;//写3次write(efd,&u1,sizeof(uint64_t))//u=1write(efd,......
  • 事件队列(EventLoop)【宏任务,微任务】
    一、概念event:事件loop:循环,循环的是一个又一个的任务队列任务队列:是一个先进先出的数据结构,排在前面的事件,优先被主线程读取任务队列分为:宏队列,微队列,分别存放宏任务和微任务二、宏任务【多个】、微任务【1个】微任务一般比宏任务先执行,并且微任务队列只有一个,宏任务队列可......
  • java如何往List<? extends number>中加入元素?体会范型集合父子关系以及范型通配符的使用
    以下来自一个stackoverflow的一个问答,写的很清楚。基本上就是子类集合的引用付给父类引用,如果父类的引用变量声明的是<?extendsParent>,则父类引用变量只能对集合进行读操作,读出来的变量是Parent类型,这是因为不确定该父类引用变量指向的是什么类型的集合,可以是Child1,也可以C......
  • [LeetCode] 2475. Number of Unequal Triplets in Array
    Youaregivena 0-indexed arrayofpositiveintegers nums.Findthenumberoftriplets (i,j,k) thatmeetthefollowingconditions:0<=i<j<k<nums.lengthnums[i], nums[j],and nums[k] are pairwisedistinct.Inotherwords, nums[i]!=......
  • oracle中rownum和row_number()
     oracle中rownum和row_number() row_number()over(partitionbycol1orderbycol2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)。与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪劣rownum然后......
  • addEventListener参数
    addEventListener(type,func,opts)type就是监听的类型,如scroll、touchstart等;func执行的方法;opts可以是Boolean和Object;Boolean表示什么阶段执行,false:冒泡阶段执行,true:捕获阶段执行,如果设置了removeEventListener移除监听时需要一样Object有三个属性{capture:Boolean,......
  • Codeforces Round #221 (Div. 2)-C. Divisible by Seven
    原题链接C.DivisiblebySeventimelimitpertestmemorylimitpertestinputoutputYouhavenumber a,whosedecimalrepresentationquiteluckilycontainsdigits1,6,8,9......
  • Educational Codeforces Round 7-D. Optimal Number Permutation
    原题链接D.OptimalNumberPermutationtimelimitpertestmemorylimitpertestinputoutputYouhavearray a thatcontainsallintegersfrom 1 to n twice.Youcanarbi......
  • Codeforces Round #232 (Div. 2)-B. On Corruption and Numbers
    原题链接B.OnCorruptionandNumberstimelimitpertestmemorylimitpertestinputoutputAlexey,amerryBerlandentrant,gotsickofthegrayrealityandhezealouslywa......
  • HDU 1394 Minimum Inversion Number(树状数组)
    题意:有一个n个整数的排列,这n个整数就是0,1,2,3...n-1这n个数(但不一定按这个顺序给出)。现在先计算一下初始排列的逆序数,然后把第一个元素a1放到an后面去,形成新排列a2a3a4...ana1,然后再求这个排列的逆序数。继续执行类似操作(一共要执行n-1次)直到产生排列ana1a2...an-1为止。......