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;
}
posted @ 2024-11-08 18:18  落/花/桂/  阅读(9)  评论(0编辑  收藏  举报
/* 设置动态特效 */