OpenJudge-NOI-1.6.08-石头剪刀布

一、题目链接

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 {
    /**
     * 返回小A和小B谁赢得次数多
     *
     * @param N  正整数,代表比赛的轮数
     * @param NA 正整数,代表小A出拳的周期
     * @param NB 正整数,代表小B出拳的周期
     * @param A  整型数组,存储小A出拳的规律
     * @param B  整型数组,存储小B出拳的规律
     * @return "A"代表小A赢得多,"B"代表小B赢得多,"draw"代表打平
     */
    public String whoWins(int N, int NA, int NB, int[] A, int[] B) {
        String ans; // 返回结果
        int winA = 0; // 小A赢的次数,初始为0
        int winB = 0; // 小B赢的次数,初始为0
        /* 从第1轮开始,到第N轮为止 */
        for (int i = 0; i < N; i++) {
            // 如果当前轮小A赢小B
            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++;
            }
            // 否则如果当前轮小B赢小A
            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) { // 如果小A赢得多
            ans = "A";
        }
        else if (winA < winB) { // 否则如果小B赢得多
            ans = "B";
        }
        else { // 否则,小A和小B打平
            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));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江苏科技大学_计算机学院_潘磊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值