切绳子(二分算法)

该博客讨论了一道编程题目,涉及到绳子切割成相同长度段的问题。题目要求找到能切割出至少K段的最长绳子长度,答案需要保留两位小数。博主分享了使用二分查找算法解决此问题的思路,并提醒注意数据类型和精度处理。在实现过程中,博主建议先将所有长度乘以100以处理小数,然后进行二分查找,最后除以100得到答案。博客强调了二分查找的细节和处理大数据时的数据类型选择。

题目描述

有 N 条绳子,它们的长度分别为Li​。如果从它们中切割出 K 条长度相同的绳子,这 K 条绳子每条最长能有多长?答案保留到小数点后 2 位(直接舍掉 2 位后的小数)。

输入格式

第一行两个整数 N 和 K,接下来 N 行,描述了每条绳子的长度 Li​ 。

输出格式

切割后每条绳子的最大长度。答案与标准答案误差不超过0.01 或者相对误差不超过 1% 即可通过。

题目的思路很简单,就是一个不断二分的过程,对于二分不太熟悉的同学可以移步二分模板题(8条消息) 二分查找(数的范围)_diao____si的博客-CSDN博客_二分查找范围

这题的主要是注意一些细节,一个是对于保留小数的问题,我们可以先把所有的数据先*100,计算结束后把结果再/100即可,另一个细节是题目的数据比较大,记得数组和数据都开longlong避免出错。

#include<iostream>
#include<cstdio>
using namespace std;
#define N 20000
long long length[N];
long long  n,k;
long long l=0;
bool check(int x)
{
    int ans=0;
    for(int i=0;i<n;i++)
    {
        ans+=length[i]/x;
    }
    return ans>=k;
}//构造函数用来判断当前二分的长度是否能够切除题目要求的段数
int main()
{
    cin>>n>>k;
    double x;
    for(int i=0;i<n;i++){
        scanf("%lf",&x);
        length[i]=x*100;//每一条绳子长度都先×一百
        l+=length[i];
    }
    long long  s=0,e=l;
    while(s<e)
    {
        long long mid=(1+s+e)/2;
        if(mid==0)break;
        if(check(mid))
            s=mid;
        else
            e=mid-1;
    }
    printf("%.2lf",s*1.00/100);//结果除以一百后约分
    return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值