生活大爆炸版石头剪刀布

生活大爆炸版石头剪刀布

题目链接

题意

这道题是关于石头剪刀布游戏的一个升级版。传统的石头剪刀布游戏中有三种手势:石头、剪刀和布。而在这个升级版游戏中,增加了两种新手势:斯波克和蜥蜴人。这五种手势之间的胜负关系如下图所示:

0 - 剪刀
1 - 石头
2 - 布
3 - 蜥蜴人
4 - 斯波克

01234
000110
110010
201001
300101
411000

现在有两个人,小A和小B,他们按照一定的周期性规律进行猜拳。已知小A的周期长度为NA,小B的周期长度为NB。他们一共进行N次猜拳。每一次猜拳的规律由一组整数表示,其中0表示剪刀,1表示石头,2表示布,3表示蜥蜴人,4表示斯波克。每一次猜拳的结果根据上述表格来判断胜负。
要统计N次猜拳结束后,小A和小B的得分。

思路

  1. 定义一个二维数组vs,用来表示五种手势之间的胜负关系。数组的下标表示手势,数组的值表示胜负关系。
  2. 定义两个变量cnta和cntb,用来记录小A和小B的得分。
  3. 使用循环遍历N次猜拳的过程。
  4. 在每一次猜拳中,根据小A和小B当前出拳的手势,在vs数组中查找胜负关系,并更新得分。

坑点

  • 注意数组的下标从0开始。
  • 注意输入和输出的格式要求

算法:模拟+二维数组

时间复杂度

O ( N ) O(N) O(N)

实现步骤

见思路

代码
#include<iostream>
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;
}

总结

这样,我们就可以根据输入的规律和周期,计算出小A和小B的得分。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值