二分法:
l 可行边界
r 不可行边界
终止条件 l == r - 1
注意:输出“0.00” 的判断
当 l != 0时,即可认为找到可行解
#include <iostream>
#include <cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
vector<int> v;
int main()
{
int N,K,l = 0,r,cnt;
float d;
scanf("%d %d",&N,&K);
for(int i = 1; i <= N; i++){
scanf("%f",&d);
v.push_back((int)( 100 * d));
}
sort(v.begin(),v.end());
r = v.back() + 1;
while(l != r-1){
int mid = (l + r)/2;
cnt = 0;
for(int i = v.size() - 1; v[i] >= mid && i >=0; i--){
cnt += v[i] / mid;
}
if(cnt >= K) {
l =mid;
}
else r = mid;
}
if(l) printf("%.2f",(double)l / 100);
else printf("0.00");
return 0;
}