刚刚写的 poj - 3122 跟这个一个意思
这个题要注意的 就最后输出吧,由于计算机内部储存问题,会有精度缺失,,需要 floor 向下取整然后再除
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<set>
#include<queue>
#include<iomanip>
#include<cmath>
using namespace std;
const int maxn = 10000 + 10;
const int INF = 0x3f3f3f3f; //1e9 + 7;
int n, m;
double a[maxn];
void init() {
scanf("%d%d", &n, &m);
for(int i = 0; i < n; ++i) {
scanf("%lf", &a[i]);
}
sort(a, a+n);
}
bool is_ok(double d) {
int cnt = 0;
for(int i = n - 1; i >= 0; --i) {
cnt += ( a[i] / d );
}
return cnt >= m;
}
void two_div() {
double l_ = 0, r_ = INF;
double mid;
for(int i = 0; i < 100; ++i) {
mid = (l_ + r_) / 2.0;
if(is_ok(mid) ) l_ = mid;
else r_ = mid;
}
printf("%.2lf\n", floor(l_*100) / 100);
//cout << fixed << setprecision(2) << mid << endl;
}
int main() {
init();
two_div();
return 0;
}