赞
踩
这道题目一定要多读几遍,才能理解。
大意就是你有钱budget 和 库存stock的金属零件,让你从一堆机器里面选择一种机器可以合成最多金属的数量是多少,这些机器合成金属需要的零件数目是不一样的,composition 数组给你了每个机器合成金属需要的零件数量,而且你还有每个零件的库存 stock 数组,当然你可以买合成金属需要的零件,每个零件的需要的金钱cost数组,但是你只有 budget 钱,问:使用其中的某台机器,能合成金属的最大数量。
这道题目有一个很重要的点就是:所有合金都需要由同一台机器制造。这个非常非常非常重要。
class Solution { public int maxNumberOfAlloys(int n, int k, int budget, List<List<Integer>> composition, List<Integer> stock, List<Integer> cost) { int low = 0, high = Collections.min(stock) + budget; // [low,high] :区间为左闭右闭 int res = 0; while (low <= high) { int mid = low + (high - low) / 2; if(isPossible(n,budget,composition,stock,cost,mid)) { // 当前 mid 数量的合金机器可以合成 ,记录下来 res = mid; low = mid + 1; }else { high = mid - 1; } } return res; } // 所有机器能不能制造 target 数量的合金 public boolean isPossible(int n,int budget,List<List<Integer>> composition,List<Integer> stock,List<Integer> cost,int target) { // 遍历所有机器 for(List<Integer> machine: composition) { // 当前机器合成 target 数量的合金需要的金钱总和 long totalCoins = 0; for(int i = 0;i < n && totalCoins <= budget ;i ++) { // 当前机器合成 target 数量的合金需要购买的 零件i 的数量 long additional = Math.max((long)machine.get(i) * target - stock.get(i),0); totalCoins += additional * cost.get(i); } if(totalCoins <= budget) { return true; } } return false; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。