前言
这次比赛的题目感觉整体上不是太难,大部分题目理解起来比较容易,但是数据规模卡的比较紧。这段时间学校的课程比较紧张,三天两头有报告要写,没什么时间练习算法,发挥的也不是很好(其实就是菜了😂)
然后就是这次比赛的最后1题,叫蓝跳跳,一道难度还是比较简单的动态规划+循环数组的题。
题目
蓝跳跳机器人从起点不回头地跳到终点,距离L。
- 一次最多可以跳k步。
- 连续地两次跳跃不能都大于等于p步,不然机器人会因为不稳定摔倒。
问:有多少种从起点跳到终点的方式?结果mod上20201114
(完整的题目记不住了,等官方出来后补上😂)
数据规模
0<p<k<100000(这个记不清了,应该差不多)
0<L<1018
样例输入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]);
}
}