这题主要难在怎么判断输赢
这里有两种方法:
1、如果我们画出关系图
可以看出每个都是两赢两输自己和自己平
所以我们就可以构造一个5个位的环,如果对方猜拳和自己不一样,对方是自己的前两个是赢,否则是输
我们就构造了这个顺序:刀0,石1,斯2,布3,人4
斯可以赢 石 和 刀
但题目和本构造顺序不一样所以要调整
for (读a顺序){
    如果是 3,4,5 就调整
}
for (读b顺序){
    如果是 3,4,5 就调整
}
for (n个回合){
    if (a==b) 不操作
    else if (b是a的前两位) a赢
    else b赢
}
代码
#include <bits/stdc++.h>
using namespace std;

const int N=10004;
int toa[N],tob[N];
int n,a,b,wina,winb;

int main(int argc, char** argv) {
	cin>>n>>a>>b;
	for(int i=0;i<a;i++){
		cin>>toa[i];
		if(toa[i]==2) toa[i]=3;
		else if(toa[i]==3) toa[i]=4;
		else if(toa[i]==4) toa[i]=2;
	}
	for(int i=0;i<b;i++){
		cin>>tob[i];
		if(tob[i]==2) tob[i]=3;
		else if(tob[i]==3) tob[i]=4;
		else if(tob[i]==4) tob[i]=2;
	}
	for(int i=0,pta=0,ptb=0;i<n;i++,pta=(pta+1+a)%a,ptb=(ptb+1+b)%b){
		int aa=toa[pta],bb=tob[ptb];
		if(aa==bb) ;
		else if((aa-1+5)%5==bb||(aa-2+5)%5==bb) wina++;
		else winb++;
	}
	cout<<wina<<" "<<winb<<endl;
	return 0;
}
2、我们可以按关系表构建输赢表
    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

for (n回合){
    a分数wina+=win[a出拳][b出拳];
    b分数winb+=win[b出拳][a出拳];
}
代码
#include <bits/stdc++.h>
using namespace std;

const int N=10004;
int toa[N],tob[N];
int n,a,b,wina,winb;
const int win[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 argc, char** argv) {
	cin>>n>>a>>b;
	for(int i=0;i<a;i++){
		cin>>toa[i];
	}
	for(int i=0;i<b;i++){
		cin>>tob[i];
	}
	for(int i=0,pta=0,ptb=0;i<n;i++,pta=(pta+1+a)%a,ptb=(ptb+1+b)%b){
		int aa=toa[pta],bb=tob[ptb];
		wina+=win[aa][bb];
		winb+=win[bb][aa];
	}
	cout<<wina<<" "<<winb<<endl;
	return 0;
}