首页 > 编程语言 >蓝桥杯算法题:开心

蓝桥杯算法题:开心

时间:2024-04-04 18:00:50浏览次数:24  
标签:开心 min res dfs 34 蓝桥 算法 static max

https://www.lanqiao.cn/problems/3824/learning

eg: n = 1234, k = 2
可以简单的列出这些选项:
● 1 + 2 + 34
● 1 + 23 + 4
● 12 + 3 + 4

利用 DFS 和回溯的思想,程序推导如下:
将 n 分成左右两部分,l 表示 left 左侧的值,r 表示 right 右侧的值。先将 l 加入 res,再将 r 作为新的 n 进入下一次 dfs,同时 k - 1。每次 dfs 结束后将 res - l,准备新的选择。如果 k == 0 表示没有多余的 '+' 号,本轮 dfs 结束,将剩下的数全部加入 res,再计算完 max 和 min 后,减掉刚刚加入的值。

dfs(1234, 2):
情况 1:1 + 2 + 34
n = 1234, k = 2
=> l = 1, r = 234, res =1, dfs(234, 1)
n = 234, k = 1
=> l = 2, r = 34, res = 3, dfs(34, 0)
n = 34, k = 0
=> res = 37, max = 37, min = 37, return
回溯:
res = 3
res = 1
情况 2:1 + 23 + 4
继续:
n = 234, k = 1
=> l = 23, r = 4, res = 24, dsf(4, 0)
n = 4, k = 0
=> res = 28, max = 37, min = 28, return
回溯:
res = 24
res = 1
res = 0
情况 3:12 + 3 + 4
继续:
n = 1234, k = 2
=> l = 12, r = 34, res = 12, dfs(34, 1)
n = 34, k = 1
=> l = 3, r = 4, res = 15, dfs(4, 0)
n = 4, k = 0
=> res = 19, max = 37, min = 19
结束

提醒:
如果用除法和取模获取 l 和 r,是不对的。
例如:n = 10000, k = 2。最终答案应该是 100 - 1 = 99。
如果使用取模获取 r,那么不管右侧剩下多少 0,最终 r 都为 0。这样做只考虑了数值而忽略了位数。
将 n 转为字符串可以准确的获取位数和数值。使用 substring 截取获得 l 和 r,使用 parseLong 转换为数值,再计算 res。

import java.util.Scanner;

public class Main {

    private static long max = Long.MIN_VALUE;
    private static long min = Long.MAX_VALUE;
    private static long res;

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        String n = scanner.next();
        int k = scanner.nextInt();

        dfs(n, k);

        System.out.println(max - min);

        scanner.close();
    }

    private static void dfs(String s, int k) {
        if (k == 0) {
            long n = Long.parseLong(s);
            res += n;
            max = Math.max(max, res);
            min = Math.min(min, res);
            res -= n;
            return;
        }

        for (int i = 0; s.length() - i - 1 >= k; i++) {
            String l = s.substring(0, i + 1);
            String r = s.substring(i + 1);
            long n = Long.parseLong(l);
            res += n;
            dfs(r, k - 1);
            res -= n;
        }
    }

}

标签:开心,min,res,dfs,34,蓝桥,算法,static,max
From: https://www.cnblogs.com/james-wangx/p/18114433

相关文章

  • 操作系统综合题之“短进程优先调度算法(Shortest-Process-First,SPF)和非抢占式优先权调
    一、问题:1.当系统采用短进程优先调度算法时,试写出进程的执行顺序,并计算各个进程的周转时间以及平均周转时间2.当系统采用优先权调度算法时,试写出进程的执行顺序,并计算各个进程的周转时间以及平均周转时间  二、参考答案上面是短进程优先调度算法下面是优先权调度算法 ......
  • 操作系统综合题之“短进程优先调度算法(Shortest-Process-First,SPF)和非抢占式优先权调
    一、问题:有5个进程A、B、C、D、E,他们的到达时间分别为0,10,20,30,35ms,预计他们的运行时间分别为100、60、20、40、80ms。其优先数分别为3、1、4、5、2(优先级数值越小,表示优先级越高)。要求1.分别给出采用短进程优先调度算法、非抢占式优先权调度算法时,进程的启动顺序2.分别计算上......
  • 蓝桥杯填九宫幻方
    通过回溯算法对未输入得数字进行全排列后,依次填入格子,判断是否符合条件。可以更改幻方的大小,来填充任意幻方#include<stdio.h>#include<stdlib.h>#include<stdbool.h>intboard[3][3];//保存输入的幻方intans[3][3][3];//填充后符合条件的幻方inttmp[3][3];//幻方......
  • Python常用算法思想--递归算法思想详解【附源码】
    递归算法能够重复性的将问题分解为同类的子问题,然后解决这些子问题,最终达到解决最开始的问题为目的。以下从解决“阶乘”问题、“汉诺塔”问题、“斐波那契数列”问题、“最大公倍数和最小公约数”问题、“小球弹跳”、“深度优先”与“广度优先”问题等六个经典递归算法的案例......
  • 文心一言 VS 讯飞星火 VS chatgpt (229)-- 算法导论16.5 2题
    二、说明如何利用引理16.12的性质2在O(|A|)时间内确定一个给定任务集合A是独立的。文心一言:引理16.12的性质2可能是指某个特定引理中关于任务集合独立性的一个性质。由于具体的引理内容没有给出,我将基于任务集合独立性的通用概念来提供一个一般性的解释。任......
  • 算法绘本-选择排序
    选择排序也是一种比较简单的排序方式,其原理是在给定的一系列值中,首先找出最小的值放在第一位,然后在剩下的值中找出最小的值放在第二位,以此类推,直到剩下的值只有一个的时候,则完成了排序。下面看一个例子,假设给定一组数字3,2,8,2,4,9,1首先是第一轮,假设第一个数字3为最小值,记录下......
  • 算法 哈希表 day03
    哈希表当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。牺牲了空间换取了时间当我们想使用哈希法来解决问题的时候,我们一般会选择如下三种数据结构。数组set(集合)map(映射)第一题:242.有效的字母异位词-力扣(LeetCode)//暴力publicstaticboo......
  • 操作系统综合题之“采用时间片轮转调度算法(Round-Robin,RR)执行,分时系统中的进程可能出
    一、问题:某分时系统中的进程可能出现下图所示的状态变化,请回答下列问题:1.根据图示,您认为该系统采用的是什么进程调度策略?2.把图中所示的每一个状态变化的原因填在下表相应位置。变化原因1 2 3 4 5 6 二、参考答案答:1.时间片轮转调度......
  • 【信号处理】基于期望最大化算法EM的最大似然递归状态估计附matlab代码
     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • 锂电池算法学习集合---基于matlab/simulink的电池参数辨识、充放电、SOC估计算法。
    整理了锂电池的多种算法合集:涵盖电动汽车Simulink模型、电动汽车动力电池SOC估算模型、动力电池及电池管理系统BMS。电动汽车动力电池SOC估算模型含有:电池参数辨识模型、电池的充放电数据、电池手册、卡尔曼滤波电池SOC文献、卡尔曼滤波算法的锂电池SOC估算模型。电池参数辨......