洛谷1328生活大爆炸版石头剪刀布
这是它的游戏规则:赢的人积1分,输和平局积0分
这个题思路是周期找对应的情况,
依旧是学习C++,
#include <iostream>
#include <cstdio>
using namespace std;
int map[5][5] = {{0,-1,1,1,-1},
{1,0,-1,1,-1},
{-1,1,0,-1,1},
{-1,-1,1,0,1},
{1,1,-1,-1,0}};
int a[201],b[201];
int main(){
int n ,na, nb;
while(scanf("%d%d%d",&n,&na,&nb)==3){
for(int i=0;i<na;i++)
scanf("%d",&a[i]);
for(int i=0;i<nb;i++)
scanf("%d",&b[i]);
int suma=0,sumb=0;
int ja=-1,jb=-1;
for(int i=0;i<n;i++){
ja=(ja+1)%na;
jb=(jb+1)%nb;
switch(map[a[ja]][b[jb]])
{
case -1: sumb++;
break;
case 1: suma++;
break;
}
}
printf("%d %d\n",suma,sumb);
}
return 0;
}
贴个在题解中看到的用c写的代码,
#include<stdio.h>
int fa,fb;
int p[55];
int main()
{
int N,Na,Nb,na[1000],nb[1000];
scanf("%d%d%d",&N,&Na,&Nb);
p[0]=p[11]=p[22]=p[33]=p[44]=2;
p[20]=p[30]=p[31]=p[42]=p[43]=1;
for(int i=1;i<5;++i)
for(int j=0;j<i;++j)
p[j*10+i]=!p[i*10+j];//对折,赢变输,输变赢
for(int i=0;i<Na;i++)
scanf("%d",&na[i]);//甲出手周期
for(int i=0;i<Nb;i++)
scanf("%d",&nb[i]);//乙出手周期
for(int i=0;i<N;i++)
{
int a=i%Na,b=i%Nb;//到甲的周期的a个动作和乙周期的第b个动作
int k=p[na[a]*10+nb[b]];//判断
if(k==0)
fa++;//表甲赢+1
if(k==1)
fb++;//乙赢+1
}
printf("%d %d",fa,fb);
return 0;
}