ABC374E | 小学数学题?
省流:二分+小学数学
注意到
题目要求
具体来讲,二分
要想不超过预算,花费就得尽可能少,也就是要使
有一群人要租车。有小客车、大客车。怎样租车最便宜?
这种问题烦人之处在于,有的时候你不仅要选最划算的车,还要让座位的利用率高(我反正只会凑答案……)。购入机器也是一样的。但是每种机器购入多少台呢?
这就引出本题的一个结论:第
换句话说,如果你主要购入
这是因为,每当你购入
那么我们直接在二分里面枚举
代码如下:
#include <bits/stdc++.h>
#define int long long
#define N 105
using namespace std;
int a[N], b[N], p[N], q[N], n, X;
bool check(int x) {
int sum = 0; //达到x生产容量的最小花费
for(int i = 1; i <= n; i++) {
int res = 1e15; //寻找最小花费
for(int j = 0; j < a[i]; j++) {
//枚举主要购买Si时,购入的Ti数量
if(j*b[i] > x) break;
int tmp = x-j*b[i];
res = min(res, j*q[i]+(tmp+a[i]-1)/a[i]*p[i]);
}
for(int j = 0; j < b[i]; j++) {
//枚举主要购买Ti时,购入的Si数量
if(j*a[i] > x) break;
int tmp = x-j*a[i];
res = min(res, j*p[i]+(tmp+b[i]-1)/b[i]*q[i]);
}
sum += res;
}
return sum <= X;
}
signed main() {
cin >> n >> X;
for(int i = 1; i <= n; i++) cin >> a[i] >> p[i] >> b[i] >> q[i];
int l = 0, r = 1e10, mid; //二分W(上界差不多1e9吧)
while(l <= r) {
mid = (l + r) >> 1;
if(check(mid)) l = mid+1;
else r = mid-1;
}
cout << l-1;
return 0;
}