对天数进行二分,右界直接1e18会溢出
#include <iostream> #include <algorithm> #include <string.h> #include <vector> #include <cmath> using namespace std; const int N = 2 * 1e6 + 10; typedef long long ll; int a[N]; int h[N]; ll c[N]; ll n, S, L; ll maxn; ll bsearch(ll l, ll r); bool check(ll x); int main() { scanf("%lld%lld%lld", &n, &S, &L); for (ll i = 0; i < n; i++) { scanf("%d", &h[i]); } for (ll i = 0; i < n; i++) { scanf("%d", &a[i]); maxn = max(maxn, max(L, S) / a[i]); } printf("%lld\n", bsearch(0, maxn)); return 0; } ll bsearch(ll l, ll r) { while (l < r) { ll mid = l + r >> 1; if (check(mid)) r = mid; else l = mid + 1; } return l; } bool check(ll x) { ll sum = 0; for (int i = 0; i < n; i++) { c[i] = h[i] + x * a[i]; } sort(c, c + n); for (int i = n - 1; i >= 0; i--) { if (c[i] < L) break; if (sum >= S) break; sum += c[i]; } if (sum >= S) return true; else return false; }