最短木板长度
最短木板长度
真题目录: 点击去查看
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 块木板,第 i ( 1 ≤ i ≤ n ) 块木板长度为 ai。 小明买了一块长度为 m 的木料,这块木料可以切割成任意块,拼接到已有的木板上,用来加长木板。 小明想让最…...
团体程序设计天梯赛-练习集——L1-034 点赞
前言 20分的题目题目不难,理解也不难,做起来有点问题 L1-034 点赞 微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。本…...
利用腾讯云cloud studio云端免费部署deepseek-R1
1. cloud studio 1.1 cloud studio介绍 Cloud Studio(云端 IDE)是基于浏览器的集成式开发环境,为开发者提供了一个稳定的云端工作站。支持CPU与GPU的访问。用户在使用 Cloud Studio 时无需安装,随时随地打开浏览器即可使用。Clo…...
LabVIEW的智能电源远程监控系统开发
在工业自动化与测试领域,电源设备的精准控制与远程管理是保障系统稳定运行的核心需求。传统电源管理依赖本地手动操作,存在响应滞后、参数调节效率低、无法实时监控等问题。通过集成工业物联网(IIoT)技术,实现电源设备…...
Docker深度解析:安装各大环境
安装 Nginx 实现负载均衡: 挂载 nginx html 文件: 创建过载目录: mkdir -p /data/nginx/{conf,conf.d,html,logs} 注意:在挂载前需要对 conf/nginx.conf 文件进行编写 worker_processes 1;events {worker_connections 1024; …...
牛客 - 链表相加(二)
描述 假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。 给定两个这种链表,请生成代表两个整数相加值的结果链表。 数据范围:0≤n,m≤1000000,链表任意值 0≤val≤9 要求:空间复杂度 O(n)&am…...
GPU 硬件原理架构(一)
这张费米管线架构图能看懂了,整个GPU的架构基本就熟了。市面上有很多GPU厂家,他们产品的架构各不相同,但是核心往往差不多,整明白一了个基本上就可以触类旁通了。下面这张图信息量很大,可以结合博客GPU 英伟达GPU架构回…...
C/C++编译器
C/C 代码是不可跨平台的,Windows 和 Unix-like 有着不同的 API,C/C 在不同平台有着不同编译器。 MSVC Windows 平台,MSVC 是 Visual Studio 中自带的 C/C 编译器。 GCC Unix-like 平台,GCC 原名 GNU C Compiler,后…...
Immutable设计 SimpleDateFormat DateTimeFormatter
专栏系列文章地址:https://blog.csdn.net/qq_26437925/article/details/145290162 本文目标: 理解不可变设计模式,时间format有线程安全要求的注意使用DateTimeFormatter 目录 ImmutableSimpleDateFormat 非线程安全可以synchronized解决&a…...
最新EFK(Elasticsearch+FileBeat+Kibana)日志收集
文章目录 1.EFK介绍2.操作前提3.FileBeat8.15下载&安装4.编写FileBeat配置文件5.启动FileBeat6.模拟实时日志数据生成7.查看索引(数据流)是否创建成功8.创建数据视图:9.查看数据视图10.使用KQL对采集的日志内容进行过滤11.给日志数据配置保留天数(扩展知识) 1.E…...
Vue 3 30天精进之旅:Day 15 - 插件和指令
欢迎来到“Vue 3 30天精进之旅”的第15天!今天我们将深入探讨Vue 3中的插件和自定义指令。这两个主题能够帮助我们扩展Vue的功能,使我们的应用更加灵活和强大。 一、插件概述 1. 什么是插件? 在Vue中,插件是一种功能扩展机制。…...
【实战篇】Android安卓本地离线实现视频检测人脸
实战篇Android安卓本地离线实现视频检测人脸 引言项目概述核心代码类介绍人脸检测流程项目地址总结 引言 在当今数字化时代,人脸识别技术已经广泛应用于各个领域,如安防监控、门禁系统、移动支付等。本文将以第三视角详细讲解如何基于bifan-wei-Face/De…...
【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter3-语言基础
三、语言基础 ECMAScript 的语法很大程度上借鉴了 C 语言和其他类 C 语言,如 Java 和 Perl。ECMAScript 中一切都区分大小写。无论是变量、函数名还是操作符,都区分大小写。 所谓标识符,就是变量、函数、属性或函数参数的名称。标识符可以由…...
(dpdk f-stack)-堆栈溢出-野指针-内存泄露(问题定位)
目的:解决堆栈溢出,野指针,内存泄露。 解决方法 [root@ test]# yum install libasan [root@ test]# cat test.c int main() { int array[10]; array[11] = 11; return 0; } [root@ test]# gcc -fsanitize=address -O1 -fno-omit-frame-pointer -g -O0 test.c -o test ./te…...
HTML5 教程之标签(3)
HTML5 <center> 标签 (已废弃) 定义和用法 <center> 标签对其包围的文本进行水平居中处理。HTML5不支持使用<center>标签,因此有关该标签的更多信息,请参考“HTML <center>标签”部分! 示例: <center>这个…...
【蓝桥】动态规划-简单-破损的楼梯
题目 解题思路 完整代码 #include <bits/stdc.h> using namespace std; const int N1e59; const long long p1e97; long long dp[N];//dp[i]表示走到第i级台阶的方案数 bool broken[N];//broken代表破损台阶的数组 int main() {int n,m;cin>>n>>m;for(int …...
如何自定义软件安装路径及Scoop包管理器使用全攻略
如何自定义软件安装路径及Scoop包管理器使用全攻略 一、为什么无法通过WingetUI自定义安装路径? 问题背景: WingetUI是Windows包管理器Winget的图形化工具,但无法直接修改软件的默认安装路径。原因如下: Winget设计限制…...
107,【7】buuctf web [CISCN2019 华北赛区 Day2 Web1]Hack World
这次先不进入靶场 看到红框里面的话就想先看看uuid是啥 定义与概念 UUID 是 Universally Unique Identifier 的缩写,即通用唯一识别码。它是一种由数字和字母组成的 128 位标识符,在理论上可以保证在全球范围内的唯一性。UUID 的设计目的是让分布式系…...
STM32 ADC单通道配置
硬件电路 接线图: ADC基本结构图 代码配置 根据基本结构框图 1.定义结构体变量 //定义结构体变量 GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO结构体变量 ADC_InitTypeDef ADC_InitStructure; //定义ADC结构体变量 2.开启RCC时钟 ADC、GPIO的时钟&#x…...
【技海登峰】Kafka漫谈系列(二)Kafka高可用副本的数据同步与选主机制
【技海登峰】Kafka漫谈系列(二)Kafka高可用副本的数据同步与选主机制 一. 数据同步 在之前的学习中有了副本Replica的概念,解决了数据备份的问题。我们还需要面临一个设计难题即:如何处理分区中Leader与Follwer节点数据同步不匹配问题所带来的风险,这也是保证数据高可用的…...
Android开发职位深度解析与面试指南
引言 Android开发作为移动应用开发的核心领域,近年来随着智能手机的普及和技术的迭代,已成为IT行业的热门职业方向。本文基于一份典型的Android开发职位描述展开,深入探讨其核心技能要求、经验门槛、工具使用等关键要素。职位描述强调了对Flutter、多线程、Framework、Andr…...
陶瓷淬火时“啪“一声裂开的瞬间,背后藏着相场模型里的连续损伤演化。今天咱们用Matlab玩个热应力场+相场断裂的耦合计算,看看脆性材料怎么被温度场玩坏
matlab相场热力耦合断裂问题,陶瓷淬火算例,paraview可视化先上主菜——相场控制方程。核心是温度场T与相场d的相爱相杀: % 热传导方程残差计算 function R_T calc_heat_residual(T, d, dt)kappa 1e-5; % 热扩散系数grad_T gradient(T);R_T…...
FindSomething:革新性网页智能信息提取工具完全指南
FindSomething:革新性网页智能信息提取工具完全指南 【免费下载链接】FindSomething 基于chrome、firefox插件的被动式信息泄漏检测工具 项目地址: https://gitcode.com/gh_mirrors/fi/FindSomething 在数字时代,网页中隐藏的敏感信息和数据模式往…...
从GigE Vision到千兆UDP:FPGA图像采集系统的灵活升级与10G MAC预留设计
从GigE Vision到千兆UDP:FPGA图像采集系统的灵活升级与10G MAC预留设计 在工业视觉和机器视觉领域,图像采集系统的带宽需求正以惊人的速度增长。随着4K、8K高分辨率相机的普及,以及多相机同步采集场景的增多,传统的千兆以太网接口…...
终极Windows 11安装指南:3分钟轻松绕过硬件检测限制
终极Windows 11安装指南:3分钟轻松绕过硬件检测限制 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.bat 还在为…...
STM32串口环形队列IAP固件更新方案
基于STM32串口环形队列的IAP实现方案1. 项目概述1.1 系统架构本方案实现了一种基于STM32F103C8T6微控制器的串口IAP(In-Application Programming)系统,采用环形队列缓冲机制解决有限SRAM空间下的固件更新问题。系统将64KB Flash空间划分为四个功能区域:B…...
从XMind到禅道:定制化脚本实现测试用例高效导入
1. 为什么需要从XMind导入测试用例到禅道? 在日常测试工作中,XMind思维导图因其直观的结构和高效的编辑方式,成为很多测试工程师编写测试用例的首选工具。我自己也深有体会,用XMind梳理测试点特别顺手,一个下午就能完成…...
3分钟打造macOS级桌面体验:开源光标主题全攻略
3分钟打造macOS级桌面体验:开源光标主题全攻略 【免费下载链接】apple_cursor Free & Open source macOS Cursors. 项目地址: https://gitcode.com/gh_mirrors/ap/apple_cursor 你知道吗?每天在电脑前工作8小时,你的鼠标指针会出现…...
手把手调参:在TMS320F28034上实现永磁电机的高功率因数控制(附代码思路)
手把手调参:在TMS320F28034上实现永磁电机的高功率因数控制(附代码思路) 当你在调试一台采用薄膜电容的永磁电机驱动器时,是否遇到过这样的困境:明明按照教科书设计了PWM波形,但实测功率因数始终卡在0.92上…...
OpenClaw自动化测试:百川2-13B量化模型多场景准确率评估
OpenClaw自动化测试:百川2-13B量化模型多场景准确率评估 1. 测试背景与目标 去年冬天,我在为团队寻找一个能处理本地自动化任务的AI助手时,偶然发现了OpenClaw这个开源框架。当时最让我头疼的是,市面上的大模型要么太贵…...
