华为OD机试统一考试D卷C卷 - 抢7游戏(

题目描述

A、B两个人玩抢7游戏,游戏规则为:

A先报一个起始数字 X(10 ≤ 起始数字 ≤ 10000),B报下一个数字 Y (X - Y < 3),A再报一个数字 Z(Y - Z < 3),以此类推,直到其中一个抢到7,抢到7即为胜者;

在B赢得比赛的情况下,一共有多少种组合?

输入描述

起始数字 M

  • 10 ≤ M ≤ 10000

输出描述

B能赢得比赛的组合次数

用例

输入

10

输出

1

说明

Java

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 创建一个Scanner对象用于接收用户输入
        Scanner scanner = new Scanner(System.in);

        // 从用户输入中接收一个整数M,表示游戏的起始或初始条件
        int M = scanner.nextInt();

        // 初始化两个BigInteger数组dpA和dpB,分别用来存储玩家A和B在每个可能的游戏状态下赢得游戏的方式的数量
        // 数组大小为M+2,是因为在迭代过程中需要访问当前状态之后的两个状态,这样可以避免数组越界错误
        BigInteger[] dpA = new BigInteger[M + 2];
        BigInteger[] dpB = new BigInteger[M + 2];

        // 使用BigInteger.ZERO初始化数组
        for (int i = 0; i < M + 2; i++) {
            dpA[i] = BigInteger.ZERO;
            dpB[i] = BigInteger.ZERO;
        }

        // 初始化dpA[M]为1,表示当游戏处于初始状态M时,玩家A有一种方式赢得游戏
        dpA[M] = BigInteger.ONE;

        // 从M-1开始递减至6,逐个计算每个可能的游戏状态下,玩家B和A赢得游戏的方式的数量
        for (int i = M - 1; i > 6; i--) {
            // 计算玩家B在状态i下赢得游戏的方式的数量
            dpB[i] = dpA[i + 1].add(dpA[i + 2]);

            // 计算玩家A在状态i下赢得游戏的方式的数量
            dpA[i] = dpB[i + 1].add(dpB[i + 2]);
        }

        // 最后,打印出玩家B在游戏状态7下赢得游戏的方式的数量
        System.out.println(dpB[7]);
    }
}

#你觉得今年春招回暖了吗#
全部评论

相关推荐

ArisRobert:统一解释一下,第4点的意思是,公司按需通知员工,没被通知到的员工是没法去上班的,所以只要没被通知到,就自动离职。就是一种比较抽象的裁员。
点赞 评论 收藏
分享
10-13 17:47
门头沟学院 Java
wulala.god:图一那个善我面过,老板网上找的题库面的
点赞 评论 收藏
分享
9 98 评论
分享
牛客网
牛客企业服务