B3880 [信息与未来 2015] 买木头

二分

B3880

思路

ans越小cnt越大于m
找到ans的最大值使cnt>=m

代码

#include <bits/stdc++.h>
using namespace std;

const int N = 1e4 + 10;
int n, m, l[N], s[N], ans;
// int cnt;// cnt(max) = 1e4  * 100 = 1e6 << 2e9

bool check(int mid)
{
    int cnt = 0;
    for (int i = 1; i <= n; i ++ )
    {
        cnt += l[i] / mid * s[i];
    }
    // cout << "mid: " << mid << " cnt: " << cnt << endl;
    return cnt >= m;
}

int SR(int l, int r)
{
    while (l < r)
    {
        int mid = l + r + 1 >> 1;
        if (check(mid)) l = mid;
        else r = mid - 1;
    }
    return r;
}

int main()
{
    cin >> n >> m >> l[1] >> s[1];
    
    for (int i = 2; i <= n; i ++ )
    {
        l[i] = ((l[i-1]*37011 + 10193) % 10000) + 1;
        s[i] = ((s[i-1]*73011 + 24793) % 100) + 1;
    }
    // for (int i = 1; i <= n; i ++ )
    // {
    //     cout << l[i] << " " << s[i] << endl;
    // }
    
    // ans越小cnt越大于m
    // 找到ans的最大值使cnt>=m
    
    cout << SR(1, 10000) << endl;
    
    return 0;
}

一些写题时的错误

  1. 数组开小了1010导致ML了

  2. 然后SR(0, 10000)可能会导致TL

  3. 还有这个cnt += l[i] / mid * s[i]; 写成循环了 ( ´•̥̥̥ω•̥̥̥` )

posted @ 2025-08-03 12:16  Roin_Long  阅读(55)  评论(0)    收藏  举报