这题使用二分来写,先找满足条件能让绳子分成K段及以上的长度, 再用二分查找找出那个最大的长度即可。
#include<bits/stdc++.h>
using namespace std;
int a[20000];
int max_duan=0;//最长的那段绳子长度
int N,K;
int tongji(int mid)
{
int sum=0;
for(int j=1;j<=N;j++)
{
sum += a[j]/mid; //这里求每根绳子除以这个数(长度),看一共能分成多少段,存在sum里
if(sum>=K) break; //满足条件有K段了就可以了
}
return sum;
}
int main()
{
double item;
cin>>N>>K;
for(int i=1;i<=N;i++)
{
cin>>item;
a[i] = item*100; //由于有包含两位小数的数输入,先转换成整数,后面再除100回来
if(a[i]>max_duan) max_duan = a[i]; //二分的右端点
}
int ans=0;
int sum=0;
int low=0,high=max_duan+1;
int mid;
while(low<=high) //开始二分
{
mid = (low+high)/2;
if(mid==0) break; //除以0肯定是不行的
sum = tongji(mid);
if(sum>=K)//首先找满足条件的,再二分找最大满足条件的
{
if(tongji(mid+1)>=K) //说明长度找小了,可以变得更大,所以再往右找
{
low = mid+1;
ans = mid;
}
else //这里表示tongji(mid+1)<K的情况出现了,说明此时的mid刚好为最大的
{
ans = mid;
break;
}
}
else //连大于或等于K都满足不了说明长度找大了,就往左找
{
high = mid-1;
}
}
printf("%.2lf\n",(double)ans/100); //还原一下再输出,记得是两位小数
return 0;
}