【2024华为OD-E卷-100分-木板】(题目+思路+JavaC++Python解析)

server/2025/2/9 4:38:11/

题目描述

给定一块木板,其长度为 n 个单位。现在需要在这块木板上切割出 m 个长度为 k 的木板段。每次切割只能沿着木板的整数位置进行,并且每次切割的成本为切割位置到木板两端中较近一端的距离。求最小的切割成本总和。

输入

  • 第一行输入一个整数 n,表示木板的长度。
  • 第二行输入一个整数 m,表示需要切割出的木板段数量。
  • 第三行输入一个整数 k,表示每个木板段的长度。

输出

  • 输出一个整数,表示最小的切割成本总和。

约束条件

  • 1 <= n <= 10^9
  • 1 <= m <= 10^6
  • 1 <= k <= n
  • m * k <= n

思路分析

  1. 贪心算法
    • 我们要尽可能地在靠近木板两端的位置进行切割,这样每次切割的成本会较小。
    • 从木板的一端开始,每次尽量靠近当前未切割部分的中间位置进行切割,可以使得剩余部分的两端都能被有效利用。
    • 但由于木板长度 n 可能非常大,直接模拟每次切割并不现实。我们需要找到一种更有效的方法来计算总成本。
  2. 数学推导
    • 假设木板初始长度为 n,需要切割成 m 段,每段长度为 k。
    • 我们可以发现,切割 m-1 次后,木板会被分成 m 段。
    • 每次切割的成本可以看作是该切割位置到木板两端中较近一端的距离。
    • 我们可以通过数学推导来简化计算,不需要显式地模拟每次切割的位置。
  3. 优化
    • 每次切割可以看作是将木板分成两部分,其中一部分被完全利用(长度为 k),另一部分继续切割。
    • 我们只需要记录每次切割后剩余木板的长度,并计算该次切割的成本(剩余长度的一半,向下取整)。
    • 重复上述过程,直到切割出 m 段木板为止。

Java 编码解析

import java.util.Scanner;

public class WoodBoard {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int k = scanner.nextInt();
        
        scanner.close();
        
        long totalCost = 0;
        int remainingSegments = m - 1;
        int currentLength = n;
        
        while (remainingSegments > 0) {
            // 每次切割的成本是当前长度的一半(向下取整)
            int cutCost = currentLength / 2;
            totalCost += cutCost;
            
            // 切割后剩余长度为剩余长度减去一个k的长度(因为已经切出一个k长度的木板段)
            currentLength -= k;
            
            remainingSegments--;
        }
        
        System.out.println(totalCost);
    }
}

C++ 编码解析

#include <iostream>
using namespace std;

int main() {
    int n, m, k;
    cin >> n >> m >> k;
    
    long long totalCost = 0;
    int remainingSegments = m - 1;
    int currentLength = n;
    
    while (remainingSegments > 0) {
        // 每次切割的成本是当前长度的一半(向下取整)
        int cutCost = currentLength / 2;
        totalCost += cutCost;
        
        // 切割后剩余长度为剩余长度减去一个k的长度(因为已经切出一个k长度的木板段)
        currentLength -= k;
        
        remainingSegments--;
    }
    
    cout << totalCost << endl;
    
    return 0;
}

Python 编码解析

def min_cutting_cost(n, m, k):
    total_cost = 0
    remaining_segments = m - 1
    current_length = n
    
    while remaining_segments > 0:
        # 每次切割的成本是当前长度的一半(向下取整)
        cut_cost = current_length // 2
        total_cost += cut_cost
        
        # 切割后剩余长度为剩余长度减去一个k的长度(因为已经切出一个k长度的木板段)
        current_length -= k
        
        remaining_segments -= 1
    
    return total_cost

# 输入
n = int(input())
m = int(input())
k = int(input())

# 输出
print(min_cutting_cost(n, m, k))


http://www.ppmy.cn/server/166119.html

相关文章

云原生详解:构建未来应用的架构革命

引言 在数字化转型的浪潮中,企业的应用开发与运维模式正经历颠覆性变革。传统单体架构的笨重、资源浪费和低效迭代已无法满足快速变化的市场需求。而**云原生(Cloud Native)**作为一种新型的架构理念和技术体系,正在重塑现代应用的设计与交付方式。它不仅是技术的革新,更…

vite共享配置之---css相关

vite和webpack都有对样式的处理&#xff0c;涉及到的有css、sass、scss、postcss、模块化&#xff0c;以下是vite和webpack对样式的处理方式 特性ViteWebpackCSS 处理方式自动处理&#xff0c;无需配置&#xff0c;使用浏览器的原生支持需要配置 style-loader 和 css-loader&a…

基于离散浣熊优化算法(Discrete Coati Optimization Algorithm,DCOA)的骑手配送路径规划研究,MATLAB代码

一、问题定义 多骑手单起点路径规划问题&#xff0c;是配送领域中极具挑战性的组合优化问题。在这一情境下&#xff0c;设有一个固定的起始点&#xff0c;比如城市中的外卖配送站、快递网点或货物仓储中心。同时&#xff0c;存在着多名负责配送任务的骑手&#xff0c;以及大量…

如果$nextTick内部抛出错误,如何处理?

如果 $nextTick 内部抛出错误,可以通过在回调函数中使用 try…catch 语句来捕获和处理这些错误。由于 $nextTick 是异步执行的,因此错误不会直接影响到 Vue 的运行,但捕获错误可以帮助你进行更好的错误处理和调试。 一、使用 try…catch 以下是如何在 $nextTick 中捕获错误…

《DeepSeek R1:7b 写一个python程序调用摄像头获取视频并显示》

C:\Users\Administrator>ollama run deepseek-r1:7b hello Hello! How can I assist you today? &#x1f60a; 写一个python程序调用摄像头获取视频并显示 好&#xff0c;我需要帮用户写一个Python程序&#xff0c;它能够使用摄像头获取视频&#xff0c;并在屏幕上显示出…

matlab simulink 汽车四分之一模型轮胎带阻尼

1、内容简介 略 matlab simulink121-汽车四分之一模型轮胎带阻尼 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略

mac执行brew services list时,无法连接GitHub

> Tapping homebrew/services Cloning into ‘/opt/homebrew/Library/Taps/homebrew/homebrew-services’… fatal: unable to access ‘https://github.com/Homebrew/homebrew-services/’: Failed to connect to github.com port 443 after 75018 ms: Couldn’t connect t…

【Linux】Linux经典面试题

文章目录 1. Linux文件系统1.1 什么是inode&#xff1f;1.2 硬链接和软链接的区别1.3 文件权限和所有权 2. Linux进程管理2.1 进程和线程的区别2.2 进程间通信&#xff08;IPC&#xff09;2.3 守护进程&#xff08;Daemon&#xff09; 3. Linux内存管理3.1 虚拟内存和物理内存3…