P1577 切绳子

解题思路

这道题目要求将N条绳子切割成K条长度相同的绳子,求每条绳子的最大可能长度。这是一个典型的二分查找问题,我们需要找到满足条件的最大切割长度。

方法思路

  1. 二分查找:在可能的最大长度范围内进行二分查找

  2. 精度处理:将长度转换为整数处理以避免浮点数精度问题

  3. 检查函数:对于每个中间值,检查是否能切割出足够数量的绳子

代码注释

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N];  // 存储绳子长度(已转换为整数)
int n,m;  // n-绳子数量,m-需要切割的绳子数量
int L,R;  // 二分查找的左右边界

// 检查函数:判断当前长度mid是否能切割出至少m条绳子
bool check(int mid)
{
    if(mid == 0) return 1;  // 特殊情况处理
    int sum = 0;  // 统计能切割出的绳子数量
    for(int i = 1; i <= n; i++)
        sum += a[i] / mid;  // 计算每条绳子能切割出的数量
    if(sum >= m) return 1;  // 满足条件
    else return 0;  // 不满足条件
}

int main()
{
    cin >> n >> m;  // 读取绳子数量和需要切割的数量
    for(int i = 1; i <= n; i++)
    {
        double x;
        cin >> x;  // 读取绳子长度(浮点数)
        a[i] = int(x * 100);  // 转换为整数(保留2位小数)
        R = max(a[i],R);  // 更新右边界(最大长度)
    }
    int ans;  // 存储最终答案
    // 二分查找过程
    while(L <= R)
    {
        int mid = (L + R) / 2;  // 计算中间值
        if(check(mid))  // 检查是否满足条件
        {
            ans = mid;  // 更新答案
            L = mid + 1;  // 尝试更大的长度
        }
        else R = mid - 1;  // 尝试更小的长度
    }
    printf("%.2f",ans / 100.0);  // 输出结果(转换回浮点数)
    return 0;
}

 

posted @ 2025-05-20 17:47  CRt0729  阅读(37)  评论(0)    收藏  举报