题意:
做一个东西需要n种材料,第i种材料需要 a[i] 个,现在每个材料有 b[i] 个,现在有k个魔法材料,这种材料能一比一的转化为任意一种材料,问最多做多少个
思路:
二分个数即可,复杂度o( nlogn ),记得在判断的时候小心爆long long
错误及反思:
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100010;
long long ori[maxn];
long long hav[maxn];
int n,k;
bool judge(long long x)
{
long long now=1ll*k;
for(int i=0;i<n;i++)
{
if(hav[i]/ori[i]>=x)
continue;
else
now-=1ll*x*ori[i]-hav[i];
if(now<0) return false;
}
return true;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%I64d",&ori[i]);
for(int i=0;i<n;i++)
scanf("%I64d",&hav[i]);
long long l=0;
long long r=2000000000;
while(l<=r)
{
long long m=(l+r)/2;
if(judge(m)) l=m+1;
else r=m-1;
}
printf("%I64d\n",r);
}