- 题意:现在有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;
}