一、题目链接
http://noi.openjudge.cn/ch0106/08/
二、解题思路
⑴ 根据题意可知:在N轮比赛中,每轮比赛需要比较小A的出拳和小B的出拳,然后根据胜负情况计数小A和小B获胜的次数;
⑵ 通过数组A[NA]存储小A出拳的规律,通过数组B[NB]存储小B出拳的规律,在第i轮比赛中,可以通过A[i % NA]和B[i % NB]获得这一轮中小
A和小B的出拳,这里0 <= i < N,既符合数组下标要求,又满足N轮比赛的要求;
⑶ 小A获胜的条件为:
A[i % NA] == 0 && B[i % NB] == 2 || A[i % NA] == 2 && B[i % NB] == 5 || A[i % NA] == 5 && B[i % NB] == 0;
⑷ 小B获胜的条件为:
A[i % NA] == 2 && B[i % NB] == 0 || A[i % NA] == 5 && B[i % NB] == 2 || A[i % NA] == 0 && B[i % NB] == 5;
⑸ 显然,方法whoWins需要注入五个参数:int N、int NA、int NB、int[] A、int[] B,分别代表比赛的轮数、小A出拳的周期、小B出拳的
周期、存储小A出拳的规律、存储小B出拳的规律,方法whoWins的返回值为String,"A"代表小A赢得多,"B"代表小B赢得多,"draw"代表打平。
三、程序代码
import java.util.Scanner;
public class Main {
public String whoWins(int N, int NA, int NB, int[] A, int[] B) {
String ans;
int winA = 0;
int winB = 0;
for (int i = 0; i < N; i++) {
if (A[i % NA] == 0 && B[i % NB] == 2 ||
A[i % NA] == 2 && B[i % NB] == 5 ||
A[i % NA] == 5 && B[i % NB] == 0) {
winA++;
}
else if (A[i % NA] == 2 && B[i % NB] == 0 ||
A[i % NA] == 5 && B[i % NB] == 2 ||
A[i % NA] == 0 && B[i % NB] == 5) {
winB++;
}
}
if (winA > winB) {
ans = "A";
}
else if (winA < winB) {
ans = "B";
}
else {
ans = "draw";
}
return ans;
}
public static void main(String[] args) {
Main test = new Main();
Scanner input = new Scanner(System.in);
int N = input.nextInt();
int NA = input.nextInt();
int NB = input.nextInt();
int[] A = new int[NA];
int[] B = new int[NB];
for (int i = 0; i < NA; i++) {
A[i] = input.nextInt();
}
for (int i = 0; i < NB; i++) {
B[i] = input.nextInt();
}
System.out.print(test.whoWins(N, NA, NB, A, B));
}
}