生活大爆炸版石头剪刀布
题意
这道题是关于石头剪刀布游戏的一个升级版。传统的石头剪刀布游戏中有三种手势:石头、剪刀和布。而在这个升级版游戏中,增加了两种新手势:斯波克和蜥蜴人。这五种手势之间的胜负关系如下图所示:
0 - 剪刀
1 - 石头
2 - 布
3 - 蜥蜴人
4 - 斯波克
0 | 1 | 2 | 3 | 4 | |
---|---|---|---|---|---|
0 | 0 | 0 | 1 | 1 | 0 |
1 | 1 | 0 | 0 | 1 | 0 |
2 | 0 | 1 | 0 | 0 | 1 |
3 | 0 | 0 | 1 | 0 | 1 |
4 | 1 | 1 | 0 | 0 | 0 |
现在有两个人,小A和小B,他们按照一定的周期性规律进行猜拳。已知小A的周期长度为NA,小B的周期长度为NB。他们一共进行N次猜拳。每一次猜拳的规律由一组整数表示,其中0表示剪刀,1表示石头,2表示布,3表示蜥蜴人,4表示斯波克。每一次猜拳的结果根据上述表格来判断胜负。
要统计N次猜拳结束后,小A和小B的得分。
思路
- 定义一个二维数组vs,用来表示五种手势之间的胜负关系。数组的下标表示手势,数组的值表示胜负关系。
- 定义两个变量cnta和cntb,用来记录小A和小B的得分。
- 使用循环遍历N次猜拳的过程。
- 在每一次猜拳中,根据小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的得分。