蓝桥杯—校内模拟赛(规律序列)
问题描述:
小明想知道,满足以下条件的正整数序列的数量:
1. 第一项为 n;
2. 第二项不超过 n;
3. 从第三项开始,每一项小于前两项的差的绝对值。
请计算,对于给定的 n,有多少种满足条件的序列。
输入格式:
输入一行包含一个整数 n。
输出格式:
输出一个整数,表示答案。答案可能很大,请输出答案除以10000的余数。
样例输入:
4
样例输出:
7
样例说明:
以下是满足条件的序列:
4 1
4 1 1
4 1 2
4 2
4 2 1
4 3
4 4
评测用例规模与约定:
对于 20% 的评测用例,1 <= n <= 5;
对于 50% 的评测用例,1 <= n <= 10;
对于 80% 的评测用例,1 <= n <= 100;
对于所有评测用例,1 <= n <= 1000。
思路:
① 研究对象始终都是只有三项,所以用大小为3的数组用来存放研究的三个对象。——序列长度未知,所以考虑递归的思想。
② 第一项、第二项的确定规则和第三项和后面的确定规则不同,观察得出,长度只有2的序列只有n(输入的第一项n)个。
注:
由于不知道具体测试用例数据,所以本人也无法确定答案是否完全正确。自己手动算出1——5的数据输入,测试出答案正确。
但是根据题目给出的评测用例规模和约定。
当输入数据较大时,本答案会超时。
如果有大神做出完美答案,拜托评论留下。
1 importjava.util.Scanner;2
3 public classMain{4 static intn,out;5 public static voidmain(String[] args) {6 Scanner scan = newScanner(System.in);7 n =scan.nextInt();8 out = 0;9 int[] arr = new int[3]; //arr用于存放一直变化的长度为3的序列研究对象
10 arr[0] =n;11 for(int i = 1; i <= n; i++) {12 arr[1] =i;13 f(arr[0], arr[1]);14 }15 System.out.println((out+n)%10000); //加上的n是,序列长度为2的所有序列数量。
16 scan.close();17 }18 private static void f(int arr0, intarr1) {19 //TODO Auto-generated method stub
20 for(int i = 1; i <= n; i++) {21 if(i
30 if(i>j) return i-j;31 else return j-i;32 }33 }
_____________________
输入:3 输出:4
满足条件的序列:
3 1
3 1 1
3 2
3 3
———————————
输入:5 输出:14
满足条件的序列:
5 1
5 1 1
5 1 5
5 1 3
5 1 3 1
5 1 3 1 1
5 2
5 2 1
5 2 2
5 3
5 3 1
5 3 1 1
5 4
5 5
———————————