华为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]);
    }
}

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

相关推荐

01-23 14:54
同济大学 Java
热爱敲代码的程序媛:给你提几点【专业技能】这个模块里面可优化的地方:1.【具备JVM调优经验】可以去b站上搜一下JVM调优的视频,估计一两个小时凭你的学习能力就能掌握JVM调优的实践方面的技能。2.【MySql优化】MySql这一栏,你去b站或者找个博客看看MySql优化,学一下,如果你本身比较熟悉MySql语句的话,那基本半天时间凭你的学习能力MySql语句优化方面的技能你也能掌握个差不多。以上1,2两点主要是因为我看你专业技能大部分都说的是偏理论,没有写应用。再就是最后,你结合你的项目,想一想你的项目中哪些sql语句是可以用MySql优化的,到时候你面试的时候也好结合着说一下。
点赞 评论 收藏
分享
评论
9
97
分享

创作者周榜

更多
牛客网
牛客企业服务