1 条题解

  • 0
    @ 2024-4-12 11:15:41

    二分答案

    可以看到答案肯定在1到23333333这个区间,容易想到暴力枚举,但是枚举太慢了,相比之下,二分答案代码量少,速度还快,还是考虑二分答案。

    参考代码

    #include <bits/stdc++.h>
    using namespace std;
    using i64 = long long;
    signed main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int l = 0, r = 23333333, len = 23333333;
        const double &hs = 11625907.5798;
        auto &&check = [&](const int &x) {
            auto cntx = x, cnty = len - x;
            auto xi = 1.0 * cntx / len;
            auto yi = 1.0 * cnty / len;
            auto ans = -1 * cntx * xi * log2(xi) - cnty * yi * log2(yi);
            // 看一下计算出来的值,错误流不会输出到评测机中
            cerr << fixed << ans << '\n';
            return ans > hs;
        };
        while(l < r) {
            auto mid = (l + r) >> 1;
            if(check(mid))
                r = mid;
            else
                l = mid + 1;
        }
        cout << l;
        return 0;
    }
    
    • 1

    信息

    ID
    1002
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    37
    已通过
    16
    上传者