D2. Magic Powder - 2
https://codeforces.com/contest/670/problem/D2
本来做的是D1,但是D2是增加了数据范围,那就直接剖析D2了。
题意:给定n个数的数组a和b,合成蛋糕需要n个元素,数组a代表了每个元素需要的数值,数组b表示现在每个元素有的数值。并且存在一个数值k,可以将k的任何数值补到b的任意位置上,但是使用的总量不能超过k。问最多可以合成多少蛋糕。
思路:一眼二分,O(n)*log(n)
inline void solve(){
int n, k;
cin >> n >> k;
vector<int> a(n);
vector<int> b(n);
for (auto& x : a) {
cin >> x;
}
for (auto& x : b) {
cin >> x;
}
auto valid = [&](long long x) {
long long need = 0;
for (int i = 0; i < n; ++i) {
need += (max(0ll, 1ll * a[i] * x - b[i]));
if (need > k) {
return false;
}
}
return true;
};
long long l = 0, r = 2e9 + 5;
while (l < r) {
long long mid = (l + r + 1) >> 1;
if (valid(mid)) {
l = mid;
}
else {
r = mid - 1;
}
}
cout << l << '\n';
}