P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布
[题目链接](https://www.luogu.com.cn/problem/P1328)
题意
两人出拳是有规律的,有周期性,有周期长度,共进行N次猜拳,分别计算出两人赢的次数。
思路
- 首先要把表格补充完整,用表格里的数作为二维数组,作为寻找赢的次数的二维数组。
- 根据题目要求依次定义输入,然后将小A,小B猜拳的规律依次找出来。
- 最后定位二维数组中两人赢的点,进行计数,然后输出。
坑点
- 坑点没有什么,主要就难点,难点在于怎样定位谁赢与赢的次数。
算法一:二维数组
实现步骤
- 首先进行打表,输入二维数组
- 遍历小A,小B猜拳的规律
- 分别统计赢的次数
代码
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;//头文件
int s[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()
{
int N,N1,N2,sum=0,ans=0;//应题目要求,定义N,N1,N2,计数器sum,ans,给计数器定义一个初值=0
cin>>N>>N1>>N2;
int a[N1]={},b[N2]={};//定义一维数组
for(int i=0;i<N1;i++)
{
cin>>a[i];//遍历小A的猜拳规律
}
for(int i=0;i<N2;i++)
{
cin>>b[i];//遍历小B的猜拳的规律
}//一维数组的输入
for(int i=0;i<N;i++)
{//统计得分(小A,小B)
sum+=s[a[i%N1]][b[i%N2]];
ans+=s[b[i%N2]][a[i%N1]];
}
cout<<sum<<" "<<ans;//最后输出统计数量,
return 0;//终止程序
}
总结
有点复杂,一维数组与二维数组的嵌套,需要定位二维数组,找到谁输谁赢,然后计数,最后输出。