为了让所有奶牛的牛蹄都能得到及时修剪,约翰计划向某工厂定制一批自动修蹄车。
制作一辆修蹄车需要用到 n 种零件,其中第 i 种零件需要用 ai 个。
由于约翰对于修蹄车数量的需求是越多越好,所以工厂也希望制作出尽可能多的修蹄车以满足客户的需求。
已知,对于第 i 种零件,工厂的库存为 bi 个。
此外,工厂中还有 k 个未加工原材料,每个原材料都可以被加工为一个任意种类的零件。
请你计算,利用现有的零件以及原材料,工厂最多可以生产出多少辆修蹄车。
输入格式
第一行包含两个整数 n,k。
第二行包含 n 个整数 a1,a2,…,an。
第三行包含 n 个整数 b1,b2,…,bn。
输出格式
一个整数,表示可以生产的修蹄车的最大可能数量。
数据范围
前 6 个测试点满足 1≤n≤10。
所有测试点满足 1≤n≤10^5,1≤k≤10^9,1≤ai,bi≤10^9。
输入样例1:
1 1000000000
1
1000000000
输出样例1:
2000000000
输入样例2:
10 1
1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000
1 1 1 1 1 1 1 1 1 1
输出样例2:
0
输入样例3:
3 1
2 1 4
11 3 16
输出样例3:
4
输入样例4:
4 3
4 3 5 6
11 12 14 20
输出样例4:
3
//二分
import java.util.*;
public class Main {
static int n;
static int k;
static int[] a;
static int[] b;
static long ans=0;
public static void main(String args[]) {
Scanner scan=new Scanner(System.in);
n=scan.nextInt();
k=scan.nextInt();
a=new int[n];
b=new int[n];
for(int i=0;i<n;i++) {
a[i]=scan.nextInt();
}
for(int i=0;i<n;i++) {
b[i]=scan.nextInt();
}
long l=0,r=(long)(2*Math.pow(10, 9)),mid=0;
while(l<=r) {
mid=l+(r-l)/2;
if(check(mid)) {
l=mid+1;
ans=mid;
}
else {
r=mid-1;
}
}
System.out.println(ans);
}
public static boolean check(long ans) {
long res=0;
for(int i=0;i<n;i++) {
long need=a[i]*ans;
if(need>b[i]) {
res+=need-b[i];
if(res>k) {
return false;
}
}
}
return true;
}
}