思路
这道题就是一个简单的二分,因为需要求最大能造多少辆车,所以选择以车的数量为二分的参数(mid)。
重点:因为求最大造车数所以我们把k值当作万能牌,也就是扑克里的癞子,你造mid辆车某种零件差几个就用k中的几个去补。判断函数中注意判断需要用k值的多少时主播第一次写成了:
int need = a[i] * (mid - c[i])
这种错误一定要避免因为b[i]中除了c[i]对个还有余数,不过主播这样写时居然过了绝大部分数据,奇奇怪怪的。
正确写法:
int need = a[i] * mid - b[i];
还有就是注意要开LL,不然比如第一个样例进行到:
LL mid = l + r + 1 >> 1;
这行时会爆int,其他的没什么了
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
int a[N],b[N],c[N]; //a是每造一辆车需要某种零件的个数,b是库存数
int n,k;
bool check(LL mid) //mid是造的车的个数,返回mid过大的情况
{
// cout << "这次mid为:" << mid << endl;
int tmp = k;
for(int i = 1 ; i <= n ; i ++)
{
if(c[i] >= mid) continue;
else{
int need = a[i] * mid - b[i];
tmp -= need;
}
if(tmp < 0) return true;
}
return false;
}
int main()
{
cin >> n >> k;
for(int i = 1 ; i <= n ; i ++) scanf("%d",&a[i]);
for(int i = 1 ; i <= n ; i ++) scanf("%d",&b[i]);
for(int i = 1 ; i <= n ; i ++) c[i] = b[i] / a[i];
int mini = 1e9,mama = 0;
for(int i = 1 ; i <= n ; i ++)
{
mini = min(mini,c[i]);
mama = max(mama,(b[i] + k)/ a[i]);
}
LL l = mini,r = mama;
// cout << l << endl << r << endl;
while(l < r)
{
LL mid = l + r + 1 >> 1;
if(check(mid)) r = mid - 1;
else l = mid;
}
cout << r << endl;
return 0;
}
算法1
(暴力枚举) $O(n^2)$
blablabla
时间复杂度
参考文献
C++ 代码
blablabla
算法2
(暴力枚举) $O(n^2)$
blablabla
时间复杂度
参考文献
C++ 代码
blablabla