题解: 这题不难,但一定要细心,关于周期循环直接 ta = (ta + 1) % Na; tb = (tb + 1) % Nb; 就行,细节:从-1 开始,第一个进去的是0就对了;
参考代码1.0: 有点烦。。。 建议参考2.0的简化代码,还不容易错。
#include <queue>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#define INF 0x3f3f3f3f
#define MAX 20010
using namespace std;
int N, Na, Nb;
int a[1010], b[1010];
int aa, bb, ta = -1, tb = -1;
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++)
{
ta = (ta + 1) % Na;
tb = (tb + 1) % Nb;
if(a[ta] == b[tb]) continue;
if((a[ta] == 2 && b[tb] == 0)||(a[ta] == 3 && b[tb] == 0)||
(a[ta] == 3 && b[tb] == 1)||(a[ta] == 4 && b[tb] == 2)||
(a[ta] == 4 && b[tb] == 3)) bb++;
else if((a[ta] == 0 && b[tb] == 2)||(a[ta] == 0 && b[tb] == 3)||
(a[ta] == 1 && b[tb] == 3)||(a[ta] == 2 && b[tb] == 4)||
(a[ta] == 3 && b[tb] == 4)) aa++;
else if((a[ta] == 0 && b[tb] == 1)||(a[ta] == 1 && b[tb] == 2)||
(a[ta] == 2 && b[tb] == 3)||(a[ta] == 0 && b[tb] == 4)||
(a[ta] == 1 && b[tb] == 4)) bb++;
else if((a[ta] == 1 && b[tb] == 0)||(a[ta] == 2 && b[tb] == 1)||
(a[ta] == 3 && b[tb] == 2)||(a[ta] == 4 && b[tb] == 0)||
(a[ta] == 4 && b[tb] == 1)) aa++;
}
cout << aa <<" "<< bb << endl;
return 0;
}
参考代码2.0: 一开始就将分数存储到二维数组,关于下标的循环可以直接 i % Na或Nb即可。。
#include <queue>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#define INF 0x3f3f3f3f
#define MAX 20010
using namespace std;
int N, Na, Nb;
int a[1010], b[1010];
int aa, bb, ta, tb;
int vis[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++)
{
aa += vis[a[i % Na]][b[i % Nb]];
bb += vis[b[i % Nb]][a[i % Na]];
}
cout << aa <<" "<< bb << endl;
return 0;
}