Acwing第149场周赛(5562.自大生产Java版)

文章讲述了如何在给定零件库存和原材料条件下,通过二分查找算法计算出利用现有的零件和原材料可以生产的修蹄车的最大数量。
摘要由CSDN通过智能技术生成

为了让所有奶牛的牛蹄都能得到及时修剪,约翰计划向某工厂定制一批自动修蹄车。

制作一辆修蹄车需要用到 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;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值