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

P2440 木材加工(py)

题目背景

要保护环境

题目描述

木材厂有 nn 根原木,现在想把这些木头切割成 kk 段长度为 ll 的小段木头(木头有可能有剩余)。

当然,我们希望得到的小段木头越长越好,请求出 ll 的最大值。

木头长度的单位是 cmcm,原木的长度都是正整数,我们要求切割得到的小段木头的长度也是正整数。

例如有两根原木长度分别为 1111 和 2121,要求切割成等长的 66 段,很明显能切割出来的小段木头长度最长为 55。

输入格式

第一行是两个正整数 n,kn,k,分别表示原木的数量,需要得到的小段的数量。

接下来 nn 行,每行一个正整数 LiLi​,表示一根原木的长度。

输出格式

仅一行,即 ll 的最大值。

如果连 1cm1cm 长的小段都切不出来,输出 0

输入输出样例

输入 #1复制

3 7
232
124
456

输出 #1复制

114

说明/提示

数据规模与约定

对于 100%100% 的数据,有 1≤n≤1051≤n≤105,1≤k≤1081≤k≤108,1≤Li≤108(i∈[1,n])1≤Li​≤108(i∈[1,n])。


可以用二分 答案

使用技巧:

1)问题可以被归纳为找到使得某命题p(x)成立(或不成立)的最大(或最小x)。

2)把p(x)看作一个值为真或假的函数,那么它一定在某个分界线的一侧全为真,另一侧全为假。

def val(num, ans):
    k = 0
    for i in num:
        k += i // ans
    return k


def find(num, l, r, k):
    max_len = 0
    while l <= r:
        mid = (l + r) // 2
        if val(num, mid) < k:
            r = mid - 1
        elif val(num, mid) >= k:
            max_len = mid# 记录可能的答案
            l = mid + 1 #找到最大的x,让命题成立
    return max_len


if __name__ == "__main__":
    n, k = map(int, input().split())
    max_x = 0
    ans = 0
    wood = []
    for _ in range(n):
        wood.append(int(input()))
        ans += wood[-1]
    max_meter = ans // k # 缩小范围
    print(find(wood, 1, max_meter, k))

 

 


http://www.kler.cn/a/430598.html

相关文章:

  • 我主编的电子技术实验手册(24)——RL并联电路
  • Java 数据库连接池:HikariCP 与 Druid 的对比
  • Vue3 完整学习笔记 - 第四部分
  • Unity GetLocalizedString()失效问题
  • SQLModel入门
  • 使用Pygame制作“吃豆人”游戏
  • 智能电网技术如何助力能源转型?
  • 暴⼒匹配算法和KMP算法介绍
  • 【实验15】LSTM的记忆能力实验
  • C++参数传递
  • 汽车总线协议分析-CAN总线
  • aosp15上winscope离线html如何使用?
  • Lambda表达式随记
  • 多AI代理框架全面对比:AutoGen、LangGraph、CrewAI、Swarm、Magentic-One,选对你的AI超级助手!
  • 软件测试丨Appium 源码分析与定制
  • 网络编程(2)(对于UDP与TCP协议深层理解)
  • hhdb客户端介绍(10)
  • 实时数据开发|Flink状态类型
  • 【面试】Spirng的IOC启动流程
  • qmake 生成debug/qmake 生成release
  • Linux 常用命令大全:文件管理、系统信息、网络操作
  • 40分钟学 Go 语言高并发:服务监控与追踪
  • selenium:新窗口切换、关闭
  • 【优选算法篇】:揭开二分查找算法的神秘面纱--数据海洋中的精准定位器
  • 深入探索 JVM:原理、机制与实战
  • docker-compose 安装部署zabbix