算法练手题目:Cable master

题目是英文,我就不放原题了,简单几句概括:

现在需要准备很多等长的网线小段。

现在从供应商那里买了一堆网线:

每根网线长度不同

可以按 1 厘米精度切割

但不能拼接(只能切)

从这些线里切出 K 段完全相同长度的网线,并且希望这些小段尽可能长

输入

第一行:

N K

N:有多少根电缆(1 ≤ N ≤ 10000)

K:需要切出的段数(1 ≤ K ≤ 10000)

接下来 N 行:

每行一个电缆长度(单位:米)

精确到小数点后两位(厘米级精度)

范围:1 m ~ 100000 m

输出

可以切出的 最大等长网线长度(米)

要求:精确到小数点后两位;如果连 1 cm 都切不出 K 段则为0.00

这是最大最小二分,小数二分,求最大值的话右缩

板子的话看老师ppt

下面是我根据板子写的一次

cpp 复制代码
bool judge(double x) {
    int cnt = 0;
    for (int i = 0; i < n; i++) {
        cnt += (int)(a[i] / x);
    }
    return cnt >= K;
}

double solve() {
    double l = 0, r = maxLen; // 最大绳子长度
    const double eps = 1e-7;

    while (r - l > eps) {
        double mid = (l + r) / 2;

        if (judge(mid)) {
            l = mid;   // 可以切够 → 尝试更长
        } else {
            r = mid;   // 不够 → 缩短
        }
    }
    return l;
}

这是最核心的两个方法,下面是完整的

cpp 复制代码
#include <iostream>
#include <iomanip>
using namespace std;

const int MAXN = 10010;

int n, k;
int len[MAXN]; // 单位:cm

bool judge(int x) {
    if (x == 0) return true;

    int cnt = 0;
    for (int i = 0; i < n; i++) {
        cnt += len[i] / x;
    }
    return cnt >= k;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> k;

    int maxLen = 0;

    for (int i = 0; i < n; i++) {
        double x;
        cin >> x;
        len[i] = (int)(x * 100 + 0.5); // 转 cm
        if (len[i] > maxLen) maxLen = len[i];
    }

    int l = 1, r = maxLen;
    int ans = 0;

    while (l <= r) {
        int mid = (l + r) / 2;

        if (judge(mid)) {
            ans = mid;
            l = mid + 1;
        } else {
            r = mid - 1;
        }
    }

    if (ans == 0) {
        cout << "0.00\n";
    } else {
        cout << fixed << setprecision(2) << ans / 100.0 << "\n";
    }

    return 0;
}
相关推荐
mCell5 小时前
Lua 编程入门:从基础语法到元表
javascript·算法·lua
wuyk5557 小时前
98.C语言易混难点:字符数组与字符串指针的底层差异
c语言·开发语言·c++·stm32·嵌入式硬件·算法
峥无7 小时前
从0到1手撕红黑树:封装实现 my_map 与 my_set(SGI-STL 源码级深度解析)
开发语言·c++·笔记·算法·stl
不会代码的小猴8 小时前
3. 控件学习1
开发语言·c++·笔记·qt·算法
203号居民10 小时前
LeetCode hot 100 —41. 缺失的第一个正数
数据结构·算法·leetcode
专注仿真12 小时前
问答大模型技术方案算法实现-熵权法融合算法 + 交叉编码器重排算法
人工智能·python·算法·语言模型·问答大模型关键算法·熵权融合算法·交叉编码器重排算法
地平线开发者13 小时前
量化为什么会有损失:从量化误差到精度下降
算法
手写码匠13 小时前
华为云Flexus+DeepSeek征文|Dify 多 Agent 会话管理与上下文工程实战:让智能体“记住该记住的,忘掉该忘掉的“
人工智能·深度学习·算法·aigc
2401_8628808213 小时前
数据结构 --- 栈
c语言·数据结构·算法