当前位置: 首页 > news >正文

蓝桥杯真题练习

小蓝在玩一个寻宝游戏, 游戏在一条笔直的道路上进行, 道路被分成了 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位置的获得的最大价值。这是本人一开始的动态规划但是时间超时,只能换种方法。

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

真题代码

 public static void main(String[] args){Scanner scanner=new Scanner(System.in);int n=scanner.nextInt();int nums[]=new int[n+1];for(int i=1;i<=n;i++){nums[i]=scanner.nextInt();}int[] dp=new int[nums.length];Arrays.fill(dp,Integer.MIN_VALUE);dp[1]=nums[1];for(int i=1;i<=n;i++){int m=m(n-i);for(int j=i+1;j<=i+m;j++){dp[j]=Math.max(dp[j],dp[i]+nums[j] );}}System.out.println(dp[n]);}public static int m(int x){for(int i=2;i<=Math.sqrt(x);i++){if(x%i==0)return i;}return x;}

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

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

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

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

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

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

输入格式

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

输出格式

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

样例输入

5 10

样例输出

14

摘自蓝桥杯题解代码

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
//dp[n][m][k]表示遇见n店,m花,还剩k酒。
//因为题目要求最后一次必须是花,因此倒数第二次肯定剩余1数量的酒。
//所以答案ans = dp[n][m-1][1]。
//当剩余偶数酒的时候,有可能你上次遇见花也遇见店。
//当剩余奇数酒的时候,你上次必遇见店。
public class Main {public static final int mod = (int)1e9+7;public static void main(String[] args) {Scanner scan = new Scanner(System.in);int n=scan.nextInt();int m=scan.nextInt();int[][][] dp = new int[n+1][m+1][m+5];dp[0][0][2]=1;dp[0][1][1]=1;dp[0][2][0]=1;for(int i=1;i<=n;i++){for(int j=0;j<=m;j++){for(int k=0;k<=m;k++){if(i>0&&k>0&&k%2==0)dp[i][j][k]+=dp[i-1][j][k/2];if(j>0)dp[i][j][k]+=dp[i][j-1][k+1];dp[i][j][k]%=mod;}}}System.out.println(dp[n][m][0]%mod);scan.close();}
}

http://www.lryc.cn/news/56309.html

相关文章:

  • 插入排序的简单理解
  • Springboot框架集成Websocket通信方式
  • 将json数据分组
  • 从零开始实现一个C++高性能服务器框架----Socket模块
  • ld: library not found for -lcrt0.o
  • 接口测试和功能测试的区别有哪些?说一些你不知道的知识
  • 深度学习实战——不同方式的模型部署(CNN、Yolo)
  • 【论文阅读】GNN阅读笔记
  • QT常用控件——QTreeWidget(树控件),QTableWidget控件
  • 为什么学校购买小型数控机床而不是大型工业数控机床?
  • 【Go自学】一文搞懂Go append方法
  • 【压测】通过Jemeter进行压力测试(超详细)
  • C# | 上位机开发新手指南(七)加密算法
  • 实验一 跨VLAN访问
  • 通信算法之130:软件无线电-接收机架构
  • C++编程大师之路:从入门到精通-C++基础入门
  • 如何在千万级数据中查询 10W 的数据并排序
  • RocketMQ消息文件过期原理
  • Docker容器理解
  • SpringBoot 整合knife4j
  • 73-归并排序练习-LeetCode148排序链表
  • Hystrix学习笔记
  • 面向对象编程(基础)8:关键字:package、import
  • 【机器学习】P10 从头到尾实现一个线性回归案例
  • 【Java EE】-多线程编程(四) 死锁
  • 学习数据结构第1天(数据结构的基本概念)
  • 南大通用数据库-Gbase-8a-学习-33-空洞率查询与解决方法
  • 为什么我们认为GPT是一个技术爆炸
  • 程序员如何能提高自己的编程水平?
  • 从零使用vuepress搭建个人博客部署.github.io