版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Nightmare_ak/article/details/78666176
题目链接:https://loj.ac/problem/6249
解题思路:因为过程具有递增性,所以考虑用二分
AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const int MAXN = 200000 + 5;
int H[MAXN], A[MAXN], n;
LL S, L;
bool check(LL time)
{
LL ans = 0;
for (int i = 0;i < n;i++)
{
if (time*LL(A[i]) + LL(H[i]) >= L)
ans += time*LL(A[i]) + LL(H[i]);
if (ans >= S)
return 1;
}
return 0;
}
LL binary_search(LL l, LL r)
{
LL ans = 0;
while (l <= r)
{
LL mid = (l + r) >> 1;
if (check(mid))
{
ans = mid;
r = mid - 1;
}
else
l = mid + 1;
}
return ans;
}
int main()
{
cin >> n >> S >> L;
for (int i = 0;i < n;i++)
scanf("%d", H + i);
LL mxx = 0;
for (int i = 0;i < n;i++)
{
scanf("%d", A + i);
mxx = max(mxx, (max(L, S) - H[i]) / A[i] + 1);
}
cout << binary_search(0, mxx) << endl;
return 0;
}