蓝桥杯真题练习

╰+哭是因爲堅強的太久メ 2023-09-25 21:27 281阅读 0赞

小蓝在玩一个寻宝游戏, 游戏在一条笔直的道路上进行, 道路被分成了 nn 个方格, 依次编号 1 至 nn, 每个方格上都有一个宝物, 宝物的分值是一个整数 (包括正数、负数和零), 当进入一个方格时即获得方格中宝物的分值。小蓝可 以获得的总分值是他从方格中获得的分值之和。

小蓝开始时站在方格 1 上并获得了方格 1 上宝物的分值, 他要经过若干步 到达方格 nn。

当小蓝站在方格 pp 上时, 他可以选择跳到 p+1p+1 到 p+D(n-p)p+D(n−p) 这些方格 中的一个, 其中 D(1)=1, D(x)(x>1)D(1)=1,D(x)(x>1) 定义为 xx 的最小质因数。

给定每个方格中宝物的分值, 请问小蓝能获得的最大总分值是多少。

输入格式

输入的第一行包含一个正整数 nn 。

第二行包含 nn 个整数, 依次表示每个方格中宝物的分值。

输出格式

输出一行包含一个整数, 表示答案。

5

1 -2 -1 3 5

输出

8

本题一开始采用的动态规划,dp[i]表示在i位置的获得的最大价值。这是本人一开始的动态规划但是时间超时,只能换种方法。

  1. for(int i=2;i<=n;i++){
  2. dp[i]=dp[i-1]+nums[i];
  3. for(int j=1;j<i;j++){
  4. int x=n-j;
  5. int m = m(x);
  6. if(m+j>=i)
  7. dp[i]=Math.max(dp[i],dp[j]+nums[i]);
  8. }
  9. }

真题代码

  1. public static void main(String[] args){
  2. Scanner scanner=new Scanner(System.in);
  3. int n=scanner.nextInt();
  4. int nums[]=new int[n+1];
  5. for(int i=1;i<=n;i++){
  6. nums[i]=scanner.nextInt();
  7. }
  8. int[] dp=new int[nums.length];
  9. Arrays.fill(dp,Integer.MIN_VALUE);
  10. dp[1]=nums[1];
  11. for(int i=1;i<=n;i++){
  12. int m=m(n-i);
  13. for(int j=i+1;j<=i+m;j++){
  14. dp[j]=Math.max(dp[j],dp[i]+nums[j] );
  15. }
  16. }
  17. System.out.println(dp[n]);
  18. }
  19. public static int m(int x){
  20. for(int i=2;i<=Math.sqrt(x);i++){
  21. if(x%i==0)
  22. return i;
  23. }
  24. return x;
  25. }

话说大诗人李白, 一生好饮。幸好他从不开车。

一天, 他提着酒显, 从家里出来, 酒显中有酒 2 斗。他边走边唱:

无事街上走,提显去打酒。 逢店加一倍, 遇花喝一斗。

这一路上, 他一共遇到店 NN 次, 遇到花 MM 次。已知最后一次遇到的是花, 他正好把酒喝光了。

请你计算李白这一路遇到店和花的顺序, 有多少种不同的可能?

注意: 显里没酒 ( 0 斗) 时遇店是合法的, 加倍后还是没酒; 但是没酒时遇 花是不合法的。

输入格式

第一行包含两个整数 NN 和 MM.

输出格式

输出一个整数表示答案。由于答案可能很大,输出模 1000000007 的结果.

样例输入

  1. 5 10

样例输出

  1. 14

摘自蓝桥杯题解代码

  1. import java.util.Scanner;
  2. // 1:无需package
  3. // 2: 类名必须Main, 不可修改
  4. //dp[n][m][k]表示遇见n店,m花,还剩k酒。
  5. //因为题目要求最后一次必须是花,因此倒数第二次肯定剩余1数量的酒。
  6. //所以答案ans = dp[n][m-1][1]。
  7. //当剩余偶数酒的时候,有可能你上次遇见花也遇见店。
  8. //当剩余奇数酒的时候,你上次必遇见店。
  9. public class Main {
  10. public static final int mod = (int)1e9+7;
  11. public static void main(String[] args) {
  12. Scanner scan = new Scanner(System.in);
  13. int n=scan.nextInt();
  14. int m=scan.nextInt();
  15. int[][][] dp = new int[n+1][m+1][m+5];
  16. dp[0][0][2]=1;
  17. dp[0][1][1]=1;
  18. dp[0][2][0]=1;
  19. for(int i=1;i<=n;i++){
  20. for(int j=0;j<=m;j++){
  21. for(int k=0;k<=m;k++){
  22. if(i>0&&k>0&&k%2==0)
  23. dp[i][j][k]+=dp[i-1][j][k/2];
  24. if(j>0)
  25. dp[i][j][k]+=dp[i][j-1][k+1];
  26. dp[i][j][k]%=mod;
  27. }
  28. }
  29. }
  30. System.out.println(dp[n][m][0]%mod);
  31. scan.close();
  32. }
  33. }

发表评论

表情:
评论列表 (有 0 条评论,281人围观)

还没有评论,来说两句吧...

相关阅读

    相关 数论

    \[蓝桥杯 2013 省 AB\] 错误票据 题目背景 某涉密单位下发了某种票据,并要在年终全部收回。 题目描述 每张票据有唯一的 ID 号,全年所有票据的

    相关 05

    重新排序 问题描述 给定一个数组 A 和一些查询 Li,Ri 求数组中第 Li 至第 Ri个元素之和。 小蓝觉得这个问题很无聊, 于是他想重新排列一下数组, 使得

    相关 4

    \[蓝桥杯 2017 省 AB\] 分巧克力 题目描述 儿童节那天有 K K K 位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。 小明一共有 N

    相关 3

    \[蓝桥杯 2015 省 B\] 移动距离 题目描述 X 星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为 $1,2,3, \\cdots $ 。

    相关 2

    \[蓝桥杯 2013 省 B\] 连号区间数 题目描述 小明这些天一直在思考这样一个奇怪而有趣的问题: 在 1 1 1 ~ N N N 的某个全排列中有多少个

    相关 -BFS

    题目描述 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。 某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或