ABC374E 题解
好题。爱做。
标签:二分。
求最大的最小值,考虑二分答案。然后问题就转化成了(求
下文记物品的代价为
假设有两种物品
但是直接枚举是会 TLE 的。注意到当我们拿了很多的
所以,
然后就做完了。时间复杂度
(我赛时更豪放一点,
code :
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
typedef double db;
const int N = 110;
int a[N], b[N], c[N], d[N], n;
ll X;
ll get(ll i, ll x) {
db c1 = b[i] * 1.0 / a[i], c2 = d[i] * 1.0 / c[i];
if(c1 > c2) swap(a[i], c[i]), swap(b[i], d[i]);
ll cnt1 = (x + a[i] - 1) / a[i], res = 1e18;
int k = 0;
while(~cnt1 && k <= 100000) {
ll cnt2 = (max(0ll, x - cnt1 * a[i]) + c[i] - 1) / c[i];
res = min(res, cnt1 * b[i] + cnt2 * d[i]);
cnt1--;
k++;
}
return res;
}
bool chk(ll mid) {
ll res = 0;
for (int i = 1; i <= n; i++) res += get(i, mid);
return res <= X;
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> X;
for (int i = 1; i <= n; i++) cin >> a[i] >> b[i] >> c[i] >> d[i];
ll l = 0, r = 1e9;
while(l < r) {
ll mid = (l + r + 1) / 2;
if(chk(mid)) l = mid;
else r = mid - 1;
}
cout << l;
return 0;
}
本文作者:Running-a-way
本文链接:https://www.cnblogs.com/Running-a-way/p/18448870
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步