B3880 [信息与未来 2015] 买木头
二分
思路
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;
}
一些写题时的错误
-
数组开小了1010导致ML了
-
然后SR(0, 10000)可能会导致TL
-
还有这个cnt += l[i] / mid * s[i]; 写成循环了 ( ´•̥̥̥ω•̥̥̥` )

浙公网安备 33010602011771号