题目:(luogu翻译错的很多)

Alice和Bob玩游戏,每人有8张牌,牌的值为0~4。每一轮当前玩家选择自己的牌A和对手的牌B,然后将A的值变为( A + B )%5,其中A和B都不是0。

当一个人手牌全为0时他就赢了。

T(T<=1e5)组询问,求最后谁赢了,如果都没赢输出Deal。(两个人都是最优方案)

题解:

博弈搜索。

只不过本题有无解情况,因此dfs会卡(应该是我太弱了)。所以考虑用bfs,相当于dfs中直接回溯。

代码:

#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int num[][][][],cnt;
int T;
int dp[],ind[];//first:second
void init()
{
for(int a=;a<=;a++)
for(int b=;a+b<=;b++)
for(int c=;a+b+c<=;c++)
for(int d=;a+b+c+d<=;d++)
num[a][b][c][d]=++cnt;
}
int tn(int a,int b)
{
return (a-)*cnt+b-;
}
int cg(int a[],int b[])
{
return tn(num[a[]][a[]][a[]][a[]],num[b[]][b[]][b[]][b[]]);
}
int gt(int a[])
{
int ret = ;
for(int i=;i<=;i++)ret+=(a[i]!=);
return ret;
}
struct node
{
int a[],b[];
int aa(){return num[a[]][a[]][a[]][a[]];}
int bb(){return num[b[]][b[]][b[]][b[]];}
int cc(){return tn(aa(),bb());}
node df()
{
node ret;
for(int i=;i<=;i++)ret.a[i]=b[i],ret.b[i]=a[i];
return ret;
}
}tmp;
queue<node>q;
int a0[],b0[];
void dfsb(int dep,int sum)
{
if(dep==)
{
int c = cg(a0,b0),ga=gt(a0),gb=gt(b0);
ind[c] = ga*gb;
if(!(ga*gb))
{
if(!ga)dp[c]=;
else dp[c]=;
tmp.a[]=-a0[]-a0[]-a0[]-a0[],tmp.a[]=a0[],tmp.a[]=a0[],tmp.a[]=a0[],tmp.a[]=a0[];
tmp.b[]=-b0[]-b0[]-b0[]-b0[],tmp.b[]=b0[],tmp.b[]=b0[],tmp.b[]=b0[],tmp.b[]=b0[];
q.push(tmp);
}
return ;
}
for(b0[dep]=;b0[dep]+sum<=;b0[dep]++)
dfsb(dep+,sum+b0[dep]);
}
void dfsa(int dep,int sum)
{
if(dep==){dfsb(,);return ;}
for(a0[dep]=;a0[dep]+sum<=;a0[dep]++)
dfsa(dep+,sum+a0[dep]);
}
void bfs()
{
while(!q.empty())
{
tmp = q.front();
q.pop();
node v = tmp.df();
for(int j=;j<=;j++)
{
if(!v.b[j])continue;
for(int i=;i<=;i++)
{
if(!v.a[i]||(i-j+)%==)continue;
v.a[i]--;
v.a[(i-j+)%]++;
int c = v.cc(),c0 = tmp.cc();
if(!ind[c])
{
v.a[i]++;
v.a[(i-j+)%]--;
continue;
}
if(dp[c0]==)
{
dp[c]=;
ind[c]=;
q.push(v);
v.a[i]++;
v.a[(i-j+)%]--;
continue;
}else if(!dp[c0])
{
dp[c]=;
}
ind[c]--;
v.a[i]++;
v.a[(i-j+)%]--;
if(ind[c])continue;
if(!dp[c])dp[c]=;
else dp[c]=;
v.a[i]--;
v.a[(i-j+)%]++;
q.push(v);
v.a[i]++;
v.a[(i-j+)%]--;
}
}
}
}
int typ;
int main()
{
init();
dfsa(,);
bfs();
scanf("%d",&T);
while(T--)
{
memset(a0,,sizeof(a0));
memset(b0,,sizeof(b0));
scanf("%d",&typ);
for(int x,i=;i<=;i++)
{
scanf("%d",&x);
a0[x]++;
}
for(int x,i=;i<=;i++)
{
scanf("%d",&x);
b0[x]++;
}
int c = typ?cg(b0,a0):cg(a0,b0);
int ans = dp[c];
if(!ans)
{
printf("Deal\n");
}else
{
if((ans-)^typ)
{
printf("Bob\n");
}else
{
printf("Alice\n");
}
}
}
return ;
}

CF919F A Game With Numbers的更多相关文章

  1. Java 位运算2-LeetCode 201 Bitwise AND of Numbers Range

    在Java位运算总结-leetcode题目博文中总结了Java提供的按位运算操作符,今天又碰到LeetCode中一道按位操作的题目 Given a range [m, n] where 0 <= ...

  2. POJ 2739. Sum of Consecutive Prime Numbers

    Sum of Consecutive Prime Numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20050 ...

  3. [LeetCode] Add Two Numbers II 两个数字相加之二

    You are given two linked lists representing two non-negative numbers. The most significant digit com ...

  4. [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字

    Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...

  5. [LeetCode] Count Numbers with Unique Digits 计算各位不相同的数字个数

    Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n. Examp ...

  6. [LeetCode] Bitwise AND of Numbers Range 数字范围位相与

    Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers ...

  7. [LeetCode] Valid Phone Numbers 验证电话号码

    Given a text file file.txt that contains list of phone numbers (one per line), write a one liner bas ...

  8. [LeetCode] Consecutive Numbers 连续的数字

    Write a SQL query to find all numbers that appear at least three times consecutively. +----+-----+ | ...

  9. [LeetCode] Compare Version Numbers 版本比较

    Compare two version numbers version1 and version1.If version1 > version2 return 1, if version1 &l ...

随机推荐

  1. Gym 100512G Grand Tour (拓扑排序)

    题意:一个团队要去参观一些学校,某些学校要在某些学校之前先参观,并且每个学校有一个权值,团队去的时间与权值的差作为难过度(最小是0), 所有的难过度的最大值是伤心度,让你安排参观顺序,使得这个伤心度最 ...

  2. python 面向对象三 访问权限 下划线 双下划线

    一.双下划线 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问. ...

  3. [App Store Connect帮助]七、在 App Store 上发行(2.2)设定价格与销售范围:将您的 App 以预订形式发布

    在首次将您的 App 发布至 App Store 前,您可以选择以预订形式提供该 App.在您的 App 发布以供下载之前,顾客可以查看您的产品页并订购您的 App.您的 App 一旦发布,顾客将会收 ...

  4. Linux的远程桌面配置

    一.Ubuntu的远程桌面 Ubuntu默认已安装好VNC服务端组件vino-server,只需要在“系统设置->首选项->桌面共享”中设置即可. 1.设置桌面共享首选项 2.设置好之后, ...

  5. Spring的事务传播性与隔离级别以及实现事物回滚

    一.事务的四个特性(ACID) 原子性(Atomicity):一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做,要么全部做. 一致性(Consistency): 数据不会因为事务的执行而 ...

  6. PostgreSQL 9.6.2版本在centOS下的安装和配置

    1.如果有用yum安装过旧版,卸载掉: yum remove postgresql* 2.更新一下yum: sudo yum update 3.去 官网 找到 适合你系统 的资源的下载地址,然后使用w ...

  7. 题解报告:hdu 1421 搬寝室(递推dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1421 Problem Description 搬寝室是很累的,xhd深有体会.时间追述2006年7月9 ...

  8. Optimizing Downloads for Efficient Network Access

    Optimizing Downloads for Efficient Network Access Previous  Next 1.This lesson teaches you to Unders ...

  9. 转】Mahout构建图书推荐系统

    原博文出自于: http://blog.fens.me/hadoop-mahout-recommend-book/ 感谢! Mahout构建图书推荐系统 Hadoop家族系列文章,主要介绍Hadoop ...

  10. 在Paint事件中绘制控件(边框)

    单纯的自己记录,将来会继续添加,侥幸被大家发现了的话请不要太鄙视... private void panel4_Paint(object sender, PaintEventArgs e) { Con ...