原题链接:
https://vjudge.net/problem/Gym-102780B
AC代码:
#include <algorithm>
#include <bits/stdc++.h>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
const int INF = 0x3fffffff;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e6 + 10;
void __init__() {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
} //head
int n;
double m;
int r[2000];
int main() {
__init__();
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> r[i];
}
double L = 0, R = 1e9;
while (R - L > 1e-10) {
double mid = L + (R - L) / 2;
double sum = 0;
for (int i = 0; i < n; i++) {
sum += (r[i] * mid) / (r[i] + mid);
}
if (sum >= m)R = mid;
else L = mid;
}
printf("%.7lf", R);
return 0;
}
二分法不断缩小范围进行查找,注意精度的控制