一、题目链接
http://noi.openjudge.cn/ch0106/08/
二、解题思路
◎ 循环遍历小A和小B每轮比赛的出拳并进行比较,累加各自获胜的次数,按照获胜次数的多少判断最终的胜负情况;
◎ 数组A[NA]、B[NB]各自存储小A、小B出拳的规律,可以通过A[i%NA]、B[i%NB]获得第i轮中小A和小B的出拳,这里0<=i<N。
三、实施步骤
◆ 方法public String whoWins(int N, int NA, int NB, int[] A, int[] B)处理所有业务逻辑:
→ 参数N为int类型的整数,代表比赛的轮数;
→ 参数NA为int类型的整数,代表小A出拳的周期长度;
→ 参数NB为int类型的整数,代表小B出拳的周期长度;
→ 参数A为int类型的数组,存储小A出拳的规律;
→ 参数B为int类型的数组,存储小B出拳的规律;
→ 方法whoWins返回String类型的字符串,"A"代表小A赢得多,"B"代表小B赢得多,"draw"代表打平。
◇ 方法whoWins实施步骤如下:
◎ 首先,定义String类型的字符串ans,代表小A和小B比赛的结果;
◎ 其次,定义两个int类型的整数winA、winB,分别代表小A、小B赢的次数,初始时均为0;
◎ 然后,通过标记i代表每轮比赛的编号,i从0开始,到N-1为止,更新步长为1,循环处理如下:
→ 如果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++;
否则如果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++;
◎ 第四,比较小A和小B各自获胜的次数:
→ 如果winA>winB:令ans="A";
否则如果winA<winB:令ans="B";
否则:令ans="draw";
◎ 最后,返回ans。
◇ 在方法main中输入比赛轮数、小A和小B出拳的周期长度、小A和小B出拳的规律,将它们作为参数注入方法whoWins,输出计算结果。
四、Java程序
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));
}
}