蓝桥杯—校内模拟赛(规律序列)
蓝桥杯—校内模拟赛(规律序列)
问题描述:
小明想知道,满足以下条件的正整数序列的数量:
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 import java.util.Scanner; 2 3 public class Main{ 4 static int n,out; 5 public static void main(String[] args) { 6 Scanner scan = new Scanner(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, int arr1) { 19 // TODO Auto-generated method stub 20 for(int i = 1; i <= n; i++) { 21 if(i < cha(arr0,arr1)) { 22 int arr2= i; 23 f(arr1,arr2); 24 out++; 25 } 26 } 27 } 28 private static int cha(int i, int j) { //返回绝对值 29 // TODO Auto-generated method stub 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
———————————