题解 P1328 【生活大爆炸版石头剪刀布】

· · 题解

这题我觉得枚举就行了!!

枚举算法:

枚举在C/C++/c#中,是一个被命名的整型常数的集合, 枚举在日常生活中很常见。 [1] 例如表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY,就是一个枚举。

1.石头剪子布,又称“猜丁壳”。是一种流传多年的猜拳游戏。起源地有争议,可以肯定的是起源于亚洲,随着亚欧贸易的不断发展它传到了欧洲,到了近现代逐渐风靡世界。

2.简单明了的规则,使得石头剪子布没有任何规则漏洞可钻,单次玩法比拼运气,多回合玩法比拼心理博弈,使得石头剪子布这个古老的游戏同时拥有“意外”与“技术”两种特性,深受世界人民喜爱。

3.比赛时间过短,观赏性较差,以及心理博弈的“高深”性,又使得这个游戏不容易被当做“普通”游戏,或者比赛来看,尽管国际上也有石头剪子布的比赛。

规则:石头打剪刀,布包石头,剪刀剪布,在这种游戏中,一锻炼了人的反应能力,二可以看出一个人的灵活性。

石头剪子布,是最平衡的游戏,发明这个游戏的人肯定是个数学家,他不仅成功的实现了五进制到三进制的转化,而且将相生相克的哲理蕴育其中。

石头剪子布具有数学上的非递移性,递移关系R的定义是(a R b 与 b R c)则a R c。一个集合同时具有反身性、反对称性与递移性时,可称作偏序关系,类似于“大”与“小”的关系。

理论上,一个集合里较“大”的元素是比较接近最优化选择。 可是,在石头剪子布这个集合里并不存在。因为剪子、石头、布都不具递移关系,如:石头赢剪子,剪子赢布、布赢石头。因为元素a,b,c都可传递到自己身上,所以这个关系可以称作非递移性。

这种“非递移性”或者“循环相克”特性,使得石头剪子布成为最平衡的游戏,规则绝对平衡,简单明了没有任何漏洞可抓,没有任何IMBAlance可供利用。

但是这不意味着石头剪子布就是一个无聊的游戏,按照概率的分析,无论石头、剪刀或者布,使用的总次数之比应该会趋近1:1:1。而事实不然,特别是当人们开始懒于思考的时候。整个游戏过程中充满了“心理博弈”,单次的输赢可能更多取决于运气,但是多次比赛的话,赢家一定是个心理博弈的高手。

话锋一转,转到本题

这题就是枚举+队列

本题游戏规则:

inline void Read()
{
    scanf("%d%d%d",&n,&n1,&n2);
    for(i=1;i<=n1;i++)
    {
        scanf("%d",&a);
        q1.push(a);
    }
    for(i=1;i<=n2;i++)
    {
        scanf("%d",&b);
        q2.push(b);
    }
}

除了输入里面用到了队列,其他的都没难度,例如:

if(a==0)
{
    if(b==0) continue;
    if(b==1) sum2++;
    if(b==2) sum1++;
    if(b==3) sum1++;
    if(b==4) sum2++;
}

最后面粘上来自charliezhi2007的代码:

#include<bits/stdc++.h>
using namespace std;
queue<int> q1;
queue<int> q2;
int n,n1,n2,a,b,i,j,l,sum1,sum2;
inline void Read()
{
    scanf("%d%d%d",&n,&n1,&n2);
    for(i=1;i<=n1;i++)
    {
        scanf("%d",&a);
        q1.push(a);
    }
    for(i=1;i<=n2;i++)
    {
        scanf("%d",&b);
        q2.push(b);
    }
}
inline void solve()
{
    for(i=1;i<=n;i++)
    {
        a=q1.front();
        b=q2.front();
        q1.pop();
        q2.pop();
        q1.push(a);
        q2.push(b);
        if(a==0)
        {
            if(b==0) continue;
            if(b==1) sum2++;
            if(b==2) sum1++;
            if(b==3) sum1++;
            if(b==4) sum2++;
        }
        if(a==1)
        {
            if(b==0) sum1++;
            if(b==1) continue;
            if(b==2) sum2++;
            if(b==3) sum1++;
            if(b==4) sum2++;
        }
        if(a==2)
        {
            if(b==0) sum2++;
            if(b==1) sum1++;
            if(b==2) continue;
            if(b==3) sum2++;
            if(b==4) sum1++;
        }
        if(a==3)
        {
            if(b==0) sum2++;
            if(b==1) sum2++;
            if(b==2) sum1++;
            if(b==3) continue;
            if(b==4) sum1++;
        }
        if(a==4)
        {
            if(b==0) sum1++;
            if(b==1) sum1++;
            if(b==2) sum2++;
            if(b==3) sum2++;
            if(b==4) continue;
        }
    }
    printf("%d %d",sum1,sum2);
}
int main()
{
    Read();
    solve();
    return 0;
}

感谢charliezhi2007提供的正确代码,我们成为基友多年

他的博客:https://www.luogu..org/blog/charliezhi2007/

我的博客:https://wangshiyao.blog.luogu.org/

再见!!