链接传送门: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;
}