第十一届蓝桥杯国赛-第10题-蓝跳跳

149 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

这次比赛的题目感觉整体上不是太难,大部分题目理解起来比较容易,但是数据规模卡的比较紧。这段时间学校的课程比较紧张,三天两头有报告要写,没什么时间练习算法,发挥的也不是很好(其实就是菜了😂) 然后就是这次比赛的最后1题,叫蓝跳跳,一道难度还是比较简单的动态规划+循环数组的题。

题目

蓝跳跳机器人从起点不回头地跳到终点,距离L。

  1. 一次最多可以跳k步。
  2. 连续地两次跳跃不能都大于等于p步,不然机器人会因为不稳定摔倒。

问:有多少种从起点跳到终点的方式?结果mod上20201114 (完整的题目记不住了,等官方出来后补上😂)

数据规模

0<p<k<100000(这个记不清了,应该差不多) 0<L<10^18^

样例输入1

3 2 5

样例输出1

9

样例输入2

5 3 10

样例输出2

397

代码

在这里插入图片描述

import java.util.Scanner;

public class Main {
	static int len;
	static int[][] arr;
	static int k;
	static int p;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		k = sc.nextInt();
		p = sc.nextInt();
		long L = sc.nextLong();
		sc.close();
		// 创建一个双层的循环数组,0层存没跳到p几次的方式个数,1层存跳至少p次的方式个数
		len = k + 1;
		arr = new int[len][2];
		int i;
		arr[0][1] = arr[0][0] = 1;
		for (i = 1; L-- > 0; i = (i + 1) % len) {
			int sum = 0;
			for (int j = 1; j < p; j++) {
				// 跳p次以内累加的是之前跳至少p次的方式个数。
				sum = (sum + arr[(len + i - j) % len][1]) % 20201114;
			}
			arr[i][0] = sum;
			for (int j = p; j <= k; j++) {
				// 跳至少p次时累加的是之前跳p次以内的方式个数。
				sum = (sum + arr[(len + i - j) % len][0]) % 20201114;
			}
			arr[i][1] = sum;
		}
		// for循环多移动了一次i,这里把i移回来。
		i = (len + i - 1) % len;
		System.out.println(arr[i][1]);
	}
}