2023年第十四届蓝桥杯JavaB组省赛真题及全部解析(下)

承接上文:2023年第十四届蓝桥杯JavaB组省赛真题及全部解析(下)。

目录

七、试题 G:买二赠一

八、试题 H:合并石子 

九、试题 I:最大开支

十、试题 J:魔法阵


题目来自:蓝桥杯官网

七、试题 G:买二赠一

• 题目分析:

因为每次我们要尽可能的使免费拿走商品的价格尽可能的大,但是免费的金额又与较便宜的物品有关,这是一道贪心题(猜的,比赛想到就可以写了,贪心的证明是非常恶心的)。

• 解题思路:

1. 排序商品价格(降序)。

2. 使用队列来存储免费的金额。

3. 遍历全部商品,遇到能免费的商品(小于队列队头元素),出队列,这个商品跳过(不加到总和)。其他的正常遍历,加到总和。

4. 一旦选了两个商品,将后面选的(肯定小于前面选的)一半价格加入队列。

5. 返回结果。

如果下面的排序写法看不懂的话,可以去看我之前写的Java sort 详解,里面都有写到。

• 代码编写:

import java.util.*;
public class Main{
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        //读入数据
        Integer[] arr = new Integer[n];
        for(int i = 0;i < n;i++){
            arr[i] = in.nextInt();
        }
        Arrays.sort(arr,(o1,o2) -> {//从大到小排序
            return o1 >= o2 ? -1 : 1;//或者(o2 - o1)
        });
        long sum = 0;//存储总花费
        Queue<Integer> q = new LinkedList<>();//存储可以免费的金额,保证是先进先出
        int count = 0;//记录何时到达二次
        for(int i = 0;i < n;i++){
            if(!q.isEmpty() && q.peek() >= arr[i]) {//说明可以免费带走
                q.poll();//队头免费金额用过了,把队头弹出去。
                continue;//跳过这个商品
            }
            sum += arr[i];
            count++;
            if(count == 2){
                count = 0;
                q.add(arr[i] / 2);//可以免费的金额,存入队列
            }
        }
        System.out.println(sum);
    }
}

• 运行结果: 

八、试题 H:合并石子 

• 题目分析:

这是一道区间 dp 的问题,关于区间 dp 可能平时会遇到的比较少。如果不了解的话,建议先去看看区间 dp,再去洛谷把 

### 第14届蓝桥杯Java B概述 第14届蓝桥杯全国软件和信息技术专业人才大吸引了众多编程爱好者的参与。对于Java B的比,参者通常会遇到一系列算法设计、数据结构应用以及逻辑推理等问题。 #### 比题目特点 比题目涵盖了多个方面,旨在考察选手的基础知识掌握情况及其解决实际问题的能力。常见的题型包括但不限于字符串处理、数操作、递归函数的应用等[^3]。 #### 示例题目解析 虽然具体的官方文档未提供详细的历试题集,但从以往的经验来看,可以推测本届事可能涉及如下类型的题目: ##### 题目一:基础算法实现 此类题目往往要求编写简单的程序来完成特定的任务,比如计算两个矩阵相加的结果或是判断给定份是否为闰。这类题目主要测试考生对基本语法的理解程度。 ```java // 计算两数之和并返回结果 public class Sum { public static int sum(int num1, int num2){ return num1 + num2; } } ``` ##### 题目二:复杂度分析与优化 此部分可能会让参者面对更复杂的场景,例如寻找最短路径或是在大量数据集中快速定位目标元素。这不仅考验了编码技巧,还涉及到时间空间效率方面的考量。 ```java import java.util.*; class ShortestPathFinder { private Map<Integer, List<Edge>> adjList; // 使用Dijkstra算法求解单源最短路径问题 public void dijkstra(int sourceVertex) { PriorityQueue<Vertex> pq = new PriorityQueue<>(Comparator.comparingInt(v -> v.distance)); Vertex start = new Vertex(sourceVertex); start.distance = 0; pq.add(start); while (!pq.isEmpty()) { Vertex current = pq.poll(); for (Edge edge : adjList.getOrDefault(current.id, Collections.emptyList())) { relax(edge, current, pq); } } } private void relax(Edge e, Vertex u, Queue<Vertex> q) { Vertex v = getOrCreateVertex(e.targetId); if (v.distance > u.distance + e.weight) { decreaseKey(q, v, u.distance + e.weight); v.predecessor = u; } } private void decreaseKey(Queue<Vertex> queue, Vertex vertex, int newValue) { queue.remove(vertex); vertex.distance = newValue; queue.add(vertex); } static final class Edge { final int targetId; final int weight; Edge(int t, int w) { this.targetId = t; this.weight = w; } } static final class Vertex implements Comparable<Vertex>{ final int id; int distance = Integer.MAX_VALUE; Vertex predecessor = null; Vertex(int i) { this.id = i; } @Override public int compareTo(Vertex o) { return Integer.compare(this.distance, o.distance); } } } ``` ##### 题目三:创新思维挑战 最后一类则是开放性的创意题,鼓励学生跳出常规思考模式,运用所学知识创造性地解决问题。这些题目没有固定的标准答案,评判标准更多依赖于解决方案的新颖性和实用性。 #### 备战建议 为了更好地准备这样的竞活动,平时应该注重以下几个方面: - **扎实基础知识**:熟练掌握各种常用的数据结构(链表、栈队列、树图)、经典算法(排序查找),这是构建高效程序的前提条件。 - **多做练习题**:通过在线平台上的模拟考试积累实战经验,熟悉不同难度级别的习题特征;同时也要学会总结归纳错误原因以便下次改进。 - **关注行业动态**:了解计算机科学领域最新的研究成果和技术趋势有助于拓宽视野,在比中能够灵活应对新颖的情境设定。
评论 58
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值