链接传送门:https://www.luogu.org/problemnew/show/P1328

理解题意后一般大家的思路都是这样的:

逐个比较嘛, 反正数据也不大,就200, 如何比较? 当然是用 if 嘛, 罗列所有的情况,反正情况也不对。

写出来的代码就是这样的

#include <cstdio>
using namespace std;
const int MAXN = 200+7;

int a1[MAXN];
int a2[MAXN];
int n, n1, n2;

int main()
{

	while(scanf("%d%d%d", &n, &n1, &n2) != EOF)
	{
		int score_a = 0;
		int score_b = 0;
		for(int i=0; i<n1; i++)
			scanf("%d", &a1[i]);
		for(int i=0; i<n2; i++)
			scanf("%d", &a2[i]);
		for(int i=0; i<n; i++)
		{
			a1[i] = a1[i%n1];
			a2[i] = a2[i%n2];
		}
		for(int i=0; i<n; i++)
		{
			switch(a1[i])
			{
				case 0:
					if(a2[i] == 2 || a2[i] == 3)
						score_a ++;
					else if(a2[i] == 0)
						break;
					else
						score_b ++;
					break;
				case 1:
					if(a2[i] == 0 || a2[i] == 3)
						score_a ++;
					else if(a2[i] == 1)
						break;
					else
						score_b ++;
					break;
				case 2:
					if(a2[i] == 1 || a2[i] == 4)
						score_a ++;
					else if(a2[i] == 2)
						break;
					else
						score_b ++;
					break;
				case 3:
					if(a2[i] == 2 || a2[i] == 4)
						score_a ++;
					else if(a2[i] == 3)
						break;
					else
						score_b ++;
					break;
				case 4:
					if(a2[i] == 0 || a2[i] == 1)
						score_a ++;
					else if(a2[i] == 4)
						break;
					else
						score_b ++;
					break;
			}
		}
		printf("%d %d\n", score_a, score_b);

	}


	return 0;
}

这个思路简单易懂,一点问题也没有。都是if,运行起来也很快,这也是我看到这道题的第一个想法。

然后我看到讨论区里有说打表的,然后就觉得这个方法更简洁,代码也简单,然后就仔细思考一下,写了一个新的代码。

#include <cstdio>
using namespace std;
const int MAXN = 200+7;

int score[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 a1[MAXN];
int a2[MAXN];
int main()
{
	int n, n1, n2;
	while(scanf("%d%d%d", &n, &n1, &n2) != EOF)
	{
		int ans1 = 0;
		int ans2 = 0;
		for(int i=0; i<n1; i++)
			scanf("%d", &a1[i]);
		for(int i=0; i<n2; i++)
			scanf("%d", &a2[i]);
		for(int i=0; i<n; i++)
		{
			ans1 += score[a1[i % n1] ][a2[i % n2] ];
			ans2 += score[a2[i % n2] ][a1[i % n1] ];
		}
		printf("%d %d\n", ans1, ans2);
	}

	return 0;
}