Cable master(二分答案)

题目:链接:https://vjudge.net/problem/POJ-1064#author=GPT_zh

  • 题意:现在有n个线段,要你由这些线段切割出k个等长的小线段,求出这k个等长线段的最大长度
  • 思路:
    记答案为ans,可以发现ans一定是大于0,并且小于等于n个线段中最长的长度(因为1<=k)
    将n个线段sort,取ans区间为(0,len[n]]
    进行二分搜索
    挨个判断这个mid对应的长度能不能切割出k个来
    输出最大的那个mid即为ans
  • 注意:
    题目以m为单位,可以将其先乘以100化作整型,最后ans再除以100,防止精度丢失
    复杂度为O(nlogn)卡cin 可以用scanf
#include<iostream>
#include<cstdio>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int n,k;
int ans=0;
const int maxn=1e6+5; int len[maxn];
int num(int length)
{
int cnt=0;
for(int i=1;i<=n;i++)
{
cnt+=len[i]/length;
}
return cnt;
}
void binary_search(int left,int right)
{
while(left<=right)
{
int mid=(left+right)/2;
if(num(mid)>=k)
{
left=mid+1;
ans=max(ans,mid);
}
else
{
right=mid-1;
}
}
}
signed main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
double t;scanf("%lf",&t);
len[i]=t*100.0;
}
sort(len+1,len+1+n);
int right=len[n];
int left=1;
binary_search(left,right);
printf("%.2f\n",(double)ans/100.0);
return 0;
}
posted @   Marinaco  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
//雪花飘落效果
点击右上角即可分享
微信分享提示