1.11--04:网线主管
网线主管
思路
- 题目要求保留小数点后两位,说明啥,如果我们要循环找答案,每次只能+0.01,不然容易错过答案,看这个数据范围,一看就炸了
考虑到二分
怎么分?
-
众所周知,二分的前提条件是内容必须有一定的规律
-
如果当前导线和除以中间长度(我们这里导线总长不变,我们二分的是截断长度=中间长度)
-
中间长度
mid=(l+r)/2
-
如果当前数量大于目标截断数量,是不是说明还能大,所以我们截去少的一部分
#include <bits/stdc++.h>
using namespace std;
long long b[10001], ans, n, s;
double t;
long long ts(int x) {
long long int num = 0;
for (int i = 1; i <= n; i++) num += b[i] / x;
return num;
}
int f(int l, int r) {
int mid = (l + r) / 2;
if (r - l <= 1)
return l;
if (ts(mid) >= s)
return f(mid, r);
else
return f(l, mid);
}
int main() {
cin >> n >> s;
for (int i = 1; i <= n; i++) {
cin >> t;
b[i] = t * 100 + 0.1;
}
if (ts(1) < s)
ans = 0;
else if (ts(1e8) >= s)
ans = 1e8;
else
ans = f(1, 1e8);
cout << fixed << setprecision(2) << ans / 100.0 + 0.0001;
return 0;
}