LibreOj - 6249

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/Nightmare_ak/article/details/78666176