/*题目是告诉你n根绳子,将其平均分为k等份,求出这个长度的值二分每份的长度判断是否等于k等份实时维护最大值*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
int type[15000];
int main()
{
int n, k;
while(scanf("%d%d", &n, &k) != EOF){
memset(type, 0, sizeof(type));
int maxx = 0;
for(int i = 0; i < n; i++) {
double x;
scanf("%lf", &x);
type[i] = x * 100; //因为直接用double会有精度损失所以将其转化为一个int最终输出时转化回来即可很正常的一个二分
maxx = max(maxx, type[i]);
}
int l = 1, r = maxx, mid; //注意这里最短是1题目已说
int res = 0;
double bb;
while(l <= r){
mid = (l+r) >> 1;
int cnt = 0;
for(int i = 0; i < n; i++)
cnt += type[i]/mid;
if(cnt < k){
r = mid - 1;
}
if(cnt >= k){ //这个题的二分判断条件就是等分的几个部分是否为k这里保存一下最大值即可
res = max(res, mid);
l = mid + 1;
}
}
printf("%.2f\n", (double)res / 100.00);
}
return 0;
}
poj1064(二分)
最新推荐文章于 2021-02-28 23:11:43 发布