网线主管
思路
- 题目要求保留小数点后两位,说明啥,如果我们要循环找答案,每次只能+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);elsereturn 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;elseans = f(1, 1e8);cout << fixed << setprecision(2) << ans / 100.0 + 0.0001;return 0;
}