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


以下题解仅供学习参考使用。

抄袭、复制题解,以达到刷AC率/AC数量或其他目的的行为,在洛谷是严格禁止的。

洛谷非常重视学术诚信。此类行为将会导致您成为作弊者。具体细则请查看洛谷社区规则

评论

  • Complicated
    思路不错哟
  • 石破天惊
    奇特的思路
  • xiaohubao
    给个赞
  • HRQ666
    思路清奇
  • longlongzhu123
  • 集♂祈
    神级代码,根本不用理解
  • eegg
    ddd
  • Focus_on
    不明觉厉
  • _orz
    厉害了
  • By_wzk
    厉害
作者: yzzxliuchao 更新时间: 2017-09-29 15:39  在Ta的博客查看 举报    468  
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200 + 10;
int n, na, nb, a[MAXN], b[MAXN], cnta, cntb;
int vs[5][5] = {{0,0,1,1,0},{1,0,0,1,0},{0,1,0,0,1},{0,0,1,0,1},{1,1,0,0,0}}; //得分表的处理 
int main()
{
    cin >> n >> na >> nb;
    for(int i = 0; i < na; i++) cin >> a[i];
    for(int i = 0; i < nb; i++) cin >> b[i];
    for(int i = 0; i < n; i++)
    {
        cnta += vs[a[i % na]][b[i % nb]]; //周期循环 
        cntb += vs[b[i % nb]][a[i % na]];
    }
    cout << cnta << " " << cntb << endl;
    return 0;
}

评论

  • 一起加油!
    不错
  • lijiahao2017
    很有帮助
  • 倾城ファン恋
    太麻烦了吧,我欣赏楼上题解
  • 倾城ファン恋
    但值得鼓励
  • longlongzhu123
    楼上题解好 .
  • 清月•神冥
    if是不是太多了 但要鼓励鼓励
  • xiong_6
    可以啊,我觉得挺好的,思路很清晰
  • GIGN_DOC
    思路不错,程序太长
  • ybwwbfjzy
    暴力模拟……可以哈
  • 一个低调的人
    我觉得中间询问输赢的那一部分可以合成一个if和一个else,if询问A的赢的情况并加分,else直接加B的分
作者: EDG浅忆 更新时间: 2017-12-25 13:50  在Ta的博客查看 举报    77  

循环

应该挺容易懂的

    #include <iostream>
    #include <cstdio>
    using namespace std;
    int main(){
        int n,na,nb,x,y,xa[201],xb[201],i,j,a,ans,bns;
        cin>>n>>na>>nb;
        for(i=1;i<=na;i++)
        {
            cin>>x;
            xa[i]=x;
        }
        for(j=1;j<=nb;j++)
        {
            cin>>y;
            xb[j]=y;
        }
        ans=0;
        bns=0;
        i=0;
        j=0;
        for(a=1;a<=n;a++)
        {
            i++;
            j++;
            if(i>na)i=1;
            if(j>nb)j=1;
            if(xa[i]==0&&xb[j]==1)bns++;
            if(xa[i]==0&&xb[j]==2)ans++;
            if(xa[i]==0&&xb[j]==3)ans++;
            if(xa[i]==0&&xb[j]==4)bns++;
            if(xa[i]==1&&xb[j]==0)ans++;
            if(xa[i]==1&&xb[j]==2)bns++;
            if(xa[i]==1&&xb[j]==3)ans++;
            if(xa[i]==1&&xb[j]==4)bns++;
            if(xa[i]==2&&xb[j]==0)bns++;
            if(xa[i]==2&&xb[j]==1)ans++;
            if(xa[i]==2&&xb[j]==3)bns++;
            if(xa[i]==2&&xb[j]==4)ans++;
            if(xa[i]==3&&xb[j]==0)bns++;
            if(xa[i]==3&&xb[j]==1)bns++;
            if(xa[i]==3&&xb[j]==2)ans++;
            if(xa[i]==3&&xb[j]==4)ans++;
            if(xa[i]==4&&xb[j]==0)ans++;
            if(xa[i]==4&&xb[j]==1)ans++;
            if(xa[i]==4&&xb[j]==2)bns++;
            if(xa[i]==4&&xb[j]==3)bns++;
        }
        cout<<ans<<" "<<bns;
        //0——剪刀    1——石头    2——布     3——蜥蜴人     4——斯波克
        return 0;
}

评论

  • HRQ666
    这是本蒟蒻的第一个题解,做的不好请见谅啊~
  • 知足常乐
    简单明了
  • 153_5621_3699
    建议可以把打表改成初始化
  • 君若成风
    大佬们,能给我这蒟蒻解释一下为什么右移吗,不右移老是0
  • Aehnuwx
    这个程序太长了吧。。。还不如就直接写if语句
  • Destiny__
    你这个和if好像没多大区别吧
  • 朔哥2002
    感觉打表过程完全可以简化
  • like1
    感觉还更复杂
  • henry09
    风格不太好,写个循环搞定
  • 皖K·AR98K
    更欣赏楼主
作者: HRQ666 更新时间: 2018-03-24 23:32  在Ta的博客查看 举报    24  

辣莫多那么多人用if,看的老夫心累啊……我这里使用了二维数组,制作了一张结果表。虽然与if差的不太多。但要稍稍快一些,也更简单明了。表的内容与题目里的那张表一样,但是要根据推理补全原表中黑的部分。

手动打表时一定要细心!

废话不多说,上程序:


//LG-P1328
//生活大爆炸版剪刀石头布 
#include<iostream>
using namespace std;
int main()
{
    int score[5][5];
    score[0][0]=0;
    score[0][1]=-1;
    score[0][2]=1;
    score[0][3]=1;
    score[0][4]=-1;
    score[1][0]=1;
    score[1][1]=0;
    score[1][2]=-1;
    score[1][3]=1;
    score[1][4]=-1;
    score[2][0]=-1;
    score[2][1]=1;
    score[2][2]=0;
    score[2][3]=-1;
    score[2][4]=1;
    score[3][0]=-1;
    score[3][1]=-1;
    score[3][2]=1;
    score[3][3]=0;
    score[3][4]=1;
    score[4][0]=1;
    score[4][1]=1;
    score[4][2]=-1;
    score[4][3]=-1;
    score[4][4]=0;
/*到这里都是打表内容;
score[a][b]是表,里面的数字含义与题目相同;
后面(=x)的内容如下:
x=1:小A胜,
x=0:平局,
x=-1:小B胜。*/
    int n,m,k;
    int ans=0;
    int bns=0;
    cin>>n>>m>>k;
    int a[m+1],b[k+1];
    //—————————————
    for(int i=1;i<=m;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<=k;i++)
    {
        cin>>b[i];
    }
//以上是在输入二人的出拳循环
    int anum=1;//小A的出拳指针
    int bnum=1;//小B的出拳指针
    for(int i=1;i<=n;i++)
    {
        if(score[a[anum]][b[bnum]]==1)
        {
            ans++;
        }//小A胜
        else if(score[a[anum]][b[bnum]]==-1)
        {
            bns++;
        }//小B胜
        anum++;//指针右移
        bnum++;//指针右移
        if(anum>m)
        {
            anum=1;
        }//超出循环,从头开始
        if(bnum>k)
        {
            bnum=1;
        }//超出循环,从头开始
    }
    cout<<ans<<" "<<bns;//输出结果
    return 0;
}```

评论

  • NO41_佚名
    对哦,可以这么用switch,学到了
  • _Wolverine
    我也是这样的
  • _Wolverine
    但好像格式不对
  • _Wolverine
    参考参考你的
  • henry09
    太繁琐
  • majorli
    太繁琐了太繁琐了太繁琐了
  • 邵宇涛2007
    为所欲为
  • npu2018302531
    两个变量的switch用法,学到了。
  • StanleyEx
    我也用switch啊
  • 是个火山a
    可以用case和default
作者: zxycoolzxycool 更新时间: 2017-08-17 20:10  在Ta的博客查看 举报    13  

竟然没有人用switch编写,震惊了我和我的小伙伴们,就写了一个,都挺麻烦的,这算是个差不多的吧。。。。。。

#include<iostream>
using namespace std;
int main()
{
    int n,na,nb,i,x,y,p,q;
    int a[10000],b[10000];
    cin>>n>>na>>nb;
    x=0;
    y=0;
    p=0;
    q=0;
    for(i=1;i<=na;i++)
    cin>>a[i];
    for(i=1;i<=nb;i++)
    cin>>b[i];
    for(i=1;i<=n;i++)
    {
        p=p%na+1;
        q=q%nb+1;
        switch(a[p])
        {
            case 0:switch(b[q])
            {
                case 1:y++;break;
                case 2:x++;break;
                case 3:x++;break;
                case 4:y++;break;
            };break;
            case 1:switch(b[q])
            {
                case 0:x++;break;
                case 2:y++;break;
                case 3:x++;break;
                case 4:y++;break;
            };break;
            case 2:switch(b[q])
            {
                case 0:y++;break;
                case 1:x++;break;
                case 3:y++;break;
                case 4:x++;break;
            };break;
            case 3:switch(b[q])
            {
                case 0:y++;break;
                case 1:y++;break;
                case 2:x++;break;
                case 4:x++;break;
            };break;
            case 4:switch(b[q])
            {
                case 0:x++;break;
                case 1:x++;break;
                case 2:y++;break;
                case 3:y++;break;
            };break;
        }
    }
    cout<<x<<" "<<y;
}

评论

  • xiong_6
    打表是个很好的方法#滑稽
  • 君若成风
    大佬们,能给我这蒟蒻解释一下为什么右移吗,不右移老是0
  • henry09
    少了return 0;
  • 康师傅
    暴力出奇迹,打表出省一
  • void_basic_learner
    初始二维数组一次过
作者: CherYou 更新时间: 2017-09-17 22:12  在Ta的博客查看 举报    9  

直接把加分表打进二维数组;

最开始看错了,以为输了要减分QAQ;

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n;
int na,nb,ans1=0,ans2=0;
int NA[205],NB[205] ;
int score[6][6]={{0,0,1,1,0},{1,0,0,1,0},{0,1,0,0,1},{0,0,1,0,1},{1,1,0,0,0}};  //关键啊
int main()
{
    scanf("%d%d%d",&n,&na,&nb);
    for(int i=1;i<=na;i++)
      scanf("%d",&NA[i]);
    for(int i=1;i<=nb;i++)
      scanf("%d",&NB[i]);
    int j=1,u=1;
    for(int i=1;i<=n;i++)
       {    
           ans1+=score[NA[j]][NB[u]]; // 算两个人的得分正反各来一次
           ans2+=score[NB[u]][NA[j]];
        if(j==na) j=1;       // 这里不是很美观自己觉得
        else j++;
           if(u==nb) u=1;
           else u++;
       }
    printf("%d %d",ans1,ans2);
}
 
反馈
如果你认为某个题解有问题,欢迎向洛谷反馈,以帮助更多的同学。



请具体说明理由,以增加反馈的可信度。