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

最短木板长度

最短木板长度

真题目录: 点击去查看

E 卷 100分题型

题目描述

小明有 n 块木板,第 i ( 1 ≤ i ≤ n ) 块木板长度为 ai。
小明买了一块长度为 m 的木料,这块木料可以切割成任意块,拼接到已有的木板上,用来加长木板。
小明想让最短的模板尽量长。请问小明加长木板后,最短木板的长度可以为多少?

输入描述

输入的第一行包含两个正整数, n ( 1 ≤ n ≤ 10^3 ), m ( 1 ≤ m ≤ 10^6 ),n 表示木板数, m 表示木板长度。
输入的第二行包含 n 个正整数, a1, a2,…an ( 1 ≤ ai ≤ 10^6 )。

输出描述

输出的唯一一行包含一个正整数,表示加长木板后,最短木板的长度最大可以为多少?

用例1

输入

5 3
4 5 3 5 5

输出

5

说明

给第1块木板长度增加1,给第3块木板长度增加2后,这5块木板长度变为[5,5,5,5,5],最短的木板的长度最大为5。

用例2

输入

5 2
4 5 3 5 5

输出

4

说明

给第3块木板长度增加1后,这5块木板长度变为[4,5,4,5,5],剩余木料的长度为1。此时剩余木料无论给哪块木板加长,最短木料的长度都为4。

题解

要想让最短的木板尽可能长,那么我们就要不停地递进式补足最短板。

比如用例输入有5个板:4 5 3 5 5,可用材料m=3,最短的板长度是3,只有一个,那么我们就将他补足到4,此时消耗了一单位长度的材料,m=2,这样的话,只剩下两种长度的板4,5,且4长度有两个,5长度有三个,最短板是长度4.接下来我们应该尽量将最短板4长度的板补足到5长度,而刚好剩余材料m=2,可以将所有4长度的板补足到5长度,此时所有板都是5长度,且材料耗尽。

贪心算法

c++

#include<iostream>
#include<vector>
#include<string>
#include <utility> 
#include <sstream>
#include<map>
#include<algorithm>
using namespace std;int main() {int n,m;cin >> n >>m;vector<int> ans(n);for (int i = 0; i < n; i++) {cin >> ans[i];}sort(ans.begin(), ans.end());// 贪心算法while (m--) {int pos = 1;for (; pos < n; pos++) {if (ans[pos] > ans[pos-1]) {break;}}ans[pos-1]++;}cout << ans[0];return 0;
}// 优化实现
#include<iostream>
#include<vector>
#include<string>
#include <utility> 
#include <sstream>
#include<map>
#include<algorithm>
#include<queue>
using namespace std;struct Compare {bool operator()(const pair<int, int>& a, const pair<int, int>& b) {return a.first > b.first; // first 值越大优先级越低}
};int main() {int n,m;cin >> n >>m;vector<int> ans(n);map<int,int> mp;for (int i = 0; i < n; i++) {cin >> ans[i];mp[ans[i]]++;}// 小顶堆priority_queue<pair<int, int>, vector<pair<int, int>>, Compare> pq;for (auto p : mp) {pq.push({p.first, p.second});}while (m != 0) {pair<int,int> top = pq.top();// 都是同样长度,平均分if (pq.size() == 1) {int count = top.second;int num = top.first;// 会自定向下取整的int diff = m / count;pq.pop();pq.push({num+diff, count});break;} else {pq.pop();pair<int,int> se = pq.top();int diff = se.first - top.first;int count = top.second;if (diff * count <= m) {pq.pop();// 将值提升至se.fisrt消耗的长度pq.push({se.first, count + se.second});m -= diff * count;} else {// 这是数量写多少都不影响答案pq.push({top.first + (m / count), 1});break;}}}cout << pq.top().first;
}

JAVA

import java.util.HashMap;
import java.util.PriorityQueue;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int m = sc.nextInt();int[] a = new int[n];for (int i = 0; i < n; i++) {a[i] = sc.nextInt();}System.out.println(getResult(m, a));}public static int getResult(int m, int[] a) {// 统计每种长度板的数量,记录到woods中,key是板长度,val是板数量HashMap<Integer, Integer> woods = new HashMap<>();for (Integer ai : a) {if (woods.containsKey(ai)) {Integer val = woods.get(ai);woods.put(ai, ++val);} else {woods.put(ai, 1);}}// 将统计到的板,按板长度排优先级,长度越短优先级越高,这里使用优先队列来实现优先级PriorityQueue<Integer[]> pq = new PriorityQueue<>((b, c) -> b[0] - c[0]);for (Integer wood : woods.keySet()) {pq.offer(new Integer[] {wood, woods.get(wood)});}// 只要还有剩余的m长度,就将他补到最短板上while (m > 0) {// 如果只有一种板长度,那么就尝试将m平均分配到各个板上if (pq.size() == 1) {Integer[] info = pq.poll();int len = info[0];int count = info[1];return len + m / count;}// 如果有多种板长度// min1是最短板Integer[] min1 = pq.poll();// min2是第二最短板Integer[] min2 = pq.peek();// diff是最短板和第二最短板的差距int diff = min2[0] - min1[0];// 将所有最短板补足到第二短板的长度,所需要总长度totalint total = diff * min1[1];// 如果m的长度不够补足所有最短板,那么说明此时最短板的长度就是题解if (total > m) {return min1[0] + m / min1[1];}// 如果m的长度刚好可以补足所有最短板,那么说明最短板可以全部升级到第二短板,且刚好用完m,因此第二短板的长度就是题解else if (total == m) {return min2[0];}// 如果m的长度足够长,能补足所有最短板到第二短板,还能有剩余,则将最短的数量加到第二短板的数量上,继续下轮循环else {m -= total;min2[1] += min1[1];}}return pq.peek()[0];}
}

Python

# 输入获取
import mathn, m = map(int, input().split())
a = list(map(int, input().split()))# 算法入口
def getResult(m, a):# 统计每种长度板的数量,记录到count中,属性是板长度,属性值是板数量count = {}for ai in a:if count.get(ai) is None:count[ai] = 1else:count[ai] += 1# 将统计到的板,按板长度升序arr = []for ai in count.keys():arr.append([int(ai), count[ai]])arr.sort(key=lambda x: x[0])# 只要还有剩余的m长度,就将他补到最短板上while m > 0:# 如果只有一种板长度,那么就尝试将m平均分配到各个板上if len(arr) == 1:lenV, count = arr[0]return lenV + math.floor(m / count)# 如果有多种板长度min1 = arr.pop(0) # min1是最短板min2 = arr[0] # min2是第二最短板# diff是最短板和第二最短板的差距diff = min2[0] - min1[0]# 将所有最短板补足到第二短板的长度,所需要总长度totaltotal = diff * min1[1]# 如果m的长度不够补足所有最短板,那么说明此时最短板的长度就是题解if total > m:return min1[0] + math.floor(m / min1[1])# 如果m的长度刚好可以补足所有最短板,那么说明最短板可以全部升级到第二短板,且刚好用完m,因此第二短板的长度就是题解elif total == m:return min2[0]# 如果m的长度足够长,能补足所有最短板到第二短板,还能有剩余,则将最短的数量加到第二短板的数量上,继续下轮循环else:m -= totalmin2[1] += min1[1]return arr[0][0]# 算法调用
print(getResult(m, a))

JavaScript

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});const lines = [];
rl.on("line", (line) => {lines.push(line);if (lines.length === 2) {const [n, m] = lines[0].split(" ").map(Number);const a = lines[1].split(" ").map(Number);console.log(getResult(m, a));lines.length = 0;}
});function getResult(m, a) {// 统计每种长度板的数量,记录到count中,属性是板长度,属性值是板数量const count = {};for (let ai of a) {count[ai] ? count[ai]++ : (count[ai] = 1);}// 将统计到的板,按板长度升序const arr = [];for (let ai in count) {arr.push([ai - 0, count[ai]]);}arr.sort((a, b) => a[0] - b[0]);// 只要还有剩余的m长度,就将他补到最短板上while (m > 0) {// 如果只有一种板长度,那么就尝试将m平均分配到各个板上if (arr.length === 1) {const [len, count] = arr[0];return len + Math.floor(m / count);}// 如果有多种板长度// min1是最短板let min1 = arr.shift();// min2是第二最短板let min2 = arr[0];// diff是最短板和第二最短板的差距let diff = min2[0] - min1[0];// 将所有最短板补足到第二短板的长度,所需要总长度totallet total = diff * min1[1];// 如果m的长度不够补足所有最短板,那么说明此时最短板的长度就是题解if (total > m) {return min1[0] + Math.floor(m / min1[1]);}// 如果m的长度刚好可以补足所有最短板,那么说明最短板可以全部升级到第二短板,且刚好用完m,因此第二短板的长度就是题解else if (total === m) {return min2[0];}// 如果m的长度足够长,能补足所有最短板到第二短板,还能有剩余,则将最短的数量加到第二短板的数量上,继续下轮循环else {m -= total;min2[1] += min1[1];}}return arr[0][0];
}

Go

package mainimport ("fmt""sort"
)func getResult(m int, a []int) int {// 统计木板长度及其数量boardCount := make(map[int]int)for _, length := range a {boardCount[length]++}// 转换为切片,并按长度排序type board struct {length intcount  int}boards := make([]board, 0, len(boardCount))for length, count := range boardCount {boards = append(boards, board{length, count})}sort.Slice(boards, func(i, j int) bool {return boards[i].length < boards[j].length})// 逐步填充最短板for i := 0; i < len(boards)-1; i++ {cur := boards[i]next := boards[i+1]// 计算当前木板与下一个木板的长度差距diff := next.length - cur.lengthtotalCost := diff * cur.countif totalCost > m {return cur.length + m/cur.count}m -= totalCostboards[i+1].count += cur.count}// 只剩下一种木板时,平分剩余 mreturn boards[len(boards)-1].length + m/boards[len(boards)-1].count
}func main() {var n, m intfmt.Scan(&n, &m)a := make([]int, n)for i := range a {fmt.Scan(&a[i])}fmt.Println(getResult(m, a))
}

相关文章:

最短木板长度

最短木板长度 真题目录: 点击去查看 E 卷 100分题型 题目描述 小明有 n 块木板&#xff0c;第 i ( 1 ≤ i ≤ n ) 块木板长度为 ai。 小明买了一块长度为 m 的木料&#xff0c;这块木料可以切割成任意块&#xff0c;拼接到已有的木板上&#xff0c;用来加长木板。 小明想让最…...

【人工智能】掌握图像风格迁移:使用Python实现艺术风格的自动化迁移

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 图像风格迁移(Image Style Transfer)是一种基于深度学习的计算机视觉技术,通过将一张图像的内容与另一张图像的艺术风格结合,生成一幅具…...

git submodules

当代码仓库中包含 .gitmodules 文件时&#xff0c;这意味着该仓库使用了 Git 子模块&#xff08;Git Submodules&#xff09;。.gitmodules 文件记录了子模块的相关信息&#xff0c;如子模块的仓库地址、路径等。若要在下载代码时一并同步子模块&#xff0c;可以按照以下几种常…...

7 与mint库对象互转宏(macros.rs)

macros.rs代码定义了一个Rust宏mint_vec&#xff0c;它用于在启用mint特性时&#xff0c;为特定的向量类型实现与mint库中对应类型的相互转换。mint库是一个提供基本数学类型&#xff08;如点、向量、矩阵等&#xff09;的Rust库&#xff0c;旨在与多个图形和数学库兼容。这个宏…...

游戏引擎 Unity - Unity 下载与安装

Unity Unity 首次发布于 2005 年&#xff0c;属于 Unity Technologies Unity 使用的开发技术有&#xff1a;C# Unity 的适用平台&#xff1a;PC、主机、移动设备、VR / AR、Web 等 Unity 的适用领域&#xff1a;开发中等画质中小型项目 Unity 适合初学者或需要快速上手的开…...

[openwrt]openwrt slaac only模式下部分终端无法获取到IPv6 DNS

问题描述 OpenWrt 中,如果启用了 RA 单播(ra_unicast),但部分终端无法获取到 DNS 信息 问题分析 RA 单播的局限性 并非所有终端都完全支持通过单播接收 RA 消息。部分终端可能无法正确解析单播 RA 中的 RDNSS(Recursive DNS Server)选项,从而导致无法获取 DNS 信息。终…...

Java 面试真题

本题适合一到三年 Java 开发 &#xff0c;以下问题都是按照原面试官提问记录 文章目录 我要进大厂系列面试题二面 我要进大厂系列面试题 全部真题&#xff0c;欢迎投稿你的面试经验。 本篇涉及基础较多&#xff0c;但要耐性看完。 JVM内存模型垃圾回收器用的哪个gc各个算法…...

验证工具:GVIM和VIM

一、定义与关系 gVim&#xff1a;gVim是Vim的图形界面版本&#xff0c;提供了更多的图形化功能&#xff0c;如菜单栏、工具栏和鼠标支持。它使得Vim的使用更加直观和方便&#xff0c;尤其对于不习惯命令行界面的用户来说。Vim&#xff1a;Vim是一个在命令行界面下运行的文本编…...

理解 C 与 C++ 中的 const 常量与数组大小的关系

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 &#x1f4af;前言&#x1f4af;数组大小的常量要求&#x1f4af;C 语言中的数组大小要求&#x1f4af;C 中的数组大小要求&#x1f4af;为什么 C 中 const 变量可以作为数组大小&#x1f4af;进一步的…...

孟加拉国_行政边界省市边界arcgis数据shp格式wgs84坐标

这篇内容将深入探讨孟加拉国的行政边界省市边界数据&#xff0c;该数据是以arcgis的shp格式提供的&#xff0c;并采用WGS84坐标系统。ArcGIS是一款广泛应用于地理信息系统&#xff08;GIS&#xff09;的专业软件&#xff0c;它允许用户处理、分析和展示地理空间数据。在GIS领域…...

安心即美的生活方式

如果你的心是安定的&#xff0c;那么&#xff0c;外界也就安静了。就像陶渊明说的&#xff1a;心远地自偏。不是走到偏远无人的边荒才能得到片刻清净&#xff0c;不需要使用洪荒之力去挣脱生活的枷锁&#xff0c;这是陶渊明式的中国知识分子的雅量。如果你自己是好的男人或女人…...

APT (Advanced Package Tool) 安装与使用-linux014

APT (Advanced Package Tool) APT (Advanced Package Tool) 是一个用于管理 Debian 和 Ubuntu 系列 Linux 发行版上的软件包的工具。它简化了软件的安装、升级、配置和删除过程。APT 为用户提供了一个统一的命令行接口&#xff0c;使得管理和安装软件变得更加简单。 APT 主要…...

深度学习篇---深度学习中的超参数张量转换模型训练

文章目录 前言第一部分&#xff1a;深度学习中的超参数1. 学习率&#xff08;Learning Rate&#xff09;定义重要性常见设置 2. 批处理大小&#xff08;Batch Size&#xff09;定义重要性常见设置 3. 迭代次数&#xff08;Number of Epochs&#xff09;定义重要性常见设置 4. 优…...

Java设计模式:行为型模式→状态模式

Java 状态模式详解 1. 定义 状态模式&#xff08;State Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许对象在内部状态改变时改变其行为。状态模式通过将状态需要的行为封装在不同的状态类中&#xff0c;实现对象行为的动态改变。该模式的核心思想是分离不同状态…...

快速幂,错位排序笔记

​ 记一下刚学明白的快速幂和错位排序的原理和代码 快速幂 原理&#xff1a; a^b (a^&#xff08;b/2&#xff09;) ^ 2&#xff08;b为偶数&#xff09; a^b a*&#xff08;a^&#xff08; (b-1)/2&#xff09;&#xff09;^2&#xff08;b为奇数&#xff09; 指数为偶数时…...

机器人基础深度学习基础

参考&#xff1a; &#xff08;1&#xff09;【具身抓取课程-1】机器人基础 &#xff08;2&#xff09;【具身抓取课程-2】深度学习基础 1 机器人基础 从平面二连杆理解机器人学 正运动学&#xff1a;从关节角度到末端执行器位置的一个映射 逆运动学&#xff1a;已知末端位置…...

Java语法进阶

目录&#xff1a; Object类、常用APICollection、泛型List、Set、数据结构、CollectionsMap与斗地主案例异常、线程线程、同步等待与唤醒案例、线程池、Lambda表达式File类、递归字节流、字符流缓冲流、转换流、序列化流、Files网络编程 十二、函数式接口Stream流、方法引用 一…...

探索 paraphrase-MiniLM-L6-v2 模型在自然语言处理中的应用

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;将文本数据转换为机器学习模型可以处理的格式是至关重要的。近年来&#xff0c;sentence-transformers 库因其在文本嵌入方面的卓越表现而受到广泛关注。本文将深入探讨 paraphrase-MiniLM-L6-v2 模型&#xff0c;这…...

《chatwise:DeepSeek的界面部署》

ChatWise&#xff1a;DeepSeek的界面部署 摘要 本文详细描述了DeepSeek公司针对其核心业务系统进行的界面部署工作。从需求分析到技术实现&#xff0c;再到测试与优化&#xff0c;全面阐述了整个部署过程中的关键步骤和解决方案。通过本文&#xff0c;读者可以深入了解DeepSee…...

论计算机网络技术专业如何?创新

计算机网络技术专业是顺应数字化时代发展的朝阳专业,前景十分广阔。它聚焦于计算机网络的规划、建设、维护与管理,从基础的网络布线、设备配置,到复杂的网络安全防护、云计算架构搭建,都在专业学习范畴内。该专业毕业生就业面广,可在互联网企业从事网络工程师岗位,负责搭…...

2. 【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--什么是微服务--微服务概述与演变

在软件架构不断演进的今天&#xff0c;微服务架构已成为许多企业构建现代化应用的首选方案。本文将深入探讨微服务的基本概念、演变历程及其出现的背景和推动因素&#xff0c;同时分析当前微服务在业界的应用现状和未来趋势&#xff0c;为读者提供一个全面的视角&#xff0c;理…...

单节锂电池外部供电自动切换的电路学习

文章目录 前言一、原理分析&#xff1a;①当VBUS处有外部电源输入时②当VBUS处无外部电源输入时 二、器件选择1、二极管2、MOS管3、其他 总结 前言 学习一种广泛应用的锂电池供电自动切换电路 电路存在外部电源时&#xff0c;优先使用外部电源供电&#xff0c;并为电池供电&…...

数据结构-堆和PriorityQueue

1.堆&#xff08;Heap&#xff09; 1.1堆的概念 堆是一种非常重要的数据结构&#xff0c;通常被实现为一种特殊的完全二叉树 如果有一个关键码的集合K{k0,k1,k2,...,kn-1}&#xff0c;把它所有的元素按照完全二叉树的顺序存储在一个一维数组中&#xff0c;如果满足ki<k2i…...

如何打造一个更友好的网站结构?

在SEO优化中&#xff0c;网站的结构往往被忽略&#xff0c;但它其实是决定谷歌爬虫抓取效率的关键因素之一。一个清晰、逻辑合理的网站结构&#xff0c;不仅能让用户更方便地找到他们需要的信息&#xff0c;还能提升搜索引擎的抓取效率 理想的网站结构应该像一棵树&#xff0c;…...

每日Attention学习20——Group Shuffle Attention

模块出处 [MICCAI 24] [link] LB-UNet: A Lightweight Boundary-Assisted UNet for Skin Lesion Segmentation 模块名称 Group Shuffle Attention (GSA) 模块作用 轻量特征学习 模块结构 模块特点 使用分组(Group)卷积降低计算量引入External Attention机制更好的学习特征S…...

VUE之组件通信(二)

1、v-model v-model的底层原理&#xff1a;是:value值和input事件的结合 $event到底是啥&#xff1f;啥时候能.target 对于原生事件&#xff0c;$event就是事件对象 &#xff0c;能.target对应自定义事件&#xff0c;$event就是触发事件时&#xff0c;所传递的数据&#xff…...

[x86 ubuntu22.04]进入S4失败

目录 1 问题描述 2 解决过程 2.1 查看内核日志 2.2 新建一个交换分区 2.3 指定交换分区的位置 1 问题描述 CPU&#xff1a;G6900E OS&#xff1a;ubuntu22.04 Kernel&#xff1a;6.8.0-49-generic 使用“echo disk > /sys/power/state”命令进入 S4&#xff0c;但是无法…...

idea隐藏无关文件

idea隐藏无关文件 如果你想隐藏某些特定类型的文件&#xff08;例如 .log 文件或 .tmp 文件&#xff09;&#xff0c;可以通过以下步骤设置&#xff1a; 打开设置 在菜单栏中选择 File > Settings&#xff08;Windows/Linux&#xff09;或 IntelliJ IDEA > Preference…...

ES6 对象扩展:对象简写,对象属性 表达式,扩展运算符 ...,Object.assign,Object.is,用法和应用场景

1. 对象属性简写 1.1 基本语法 // 传统写法 const name John; const age 25; const user {name: name,age: age };// ES6 简写语法 const user {name,age };1.2 实际应用场景 // 1. 函数返回对象 function createUser(name, age, email) {return {name,age,email}; }// …...

文献阅读 250205-Global patterns and drivers of tropical aboveground carbon changes

Global patterns and drivers of tropical aboveground carbon changes 来自 <Global patterns and drivers of tropical aboveground carbon changes | Nature Climate Change> 热带地上碳变化的全球模式和驱动因素 ## Abstract: Tropical terrestrial ecosystems play …...