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 @ 2024-12-19 20:39  Marinaco  阅读(16)  评论(0)    收藏  举报
//雪花飘落效果