赞
踩
时间限制:2s 内存限制:1024MB
你的冰箱里有 N 种配料。我们称它们为配料1、…和配料 N。您有 Qi 克配料 i 。
您可以制作两种菜肴。制作一份 A 菜肴,需要 Ai 克的配料 i (1≤i≤N)。制作一份 B 菜肴,每种材料需要 Bi 克 i 。每种菜只能做整数份。
仅使用冰箱中的配料,你最多可以制作多少份菜肴?
输入内容由标准输入法提供,格式如下
N
Q1 Q2 … QN
A1 A2 … AN
B1 B2 … BN
1 ≤ N ≤ 10
1 ≤ Qi ≤ 10^6
0 ≤ Ai ≤ 10^6
有一个 i 使得 Ai ≥1 .
0 ≤ Bi ≤ 10^6
有一个 i ,Bi ≥ 1 。
所有输入值均为整数。
假设您最多可以制作 S 份菜肴,请打印整数 S 。
样例一、
2
800 300
100 100
200 10
样例二、
2
800 300
100 0
0 10
样例一、
5
样例二、
38
对于第一个测试用例,这台冰箱有 800 克配料 1 和 300 克配料 2 。
你可以用 100 克配料 1 和 100 克配料 2 制作一份 A 菜,用 200 克配料 1 和 10 克配料 2 制作一份 B 菜。
要制作两份 A 菜和三份 B 菜,需要 100 × 2 + 200 × 3 = 800 克配料 1 和 100 × 2 + 10 × 3 = 230 克配料 2 ,这两种配料都不会超过冰箱里的用量。这样一共可以做 5 份菜肴,但不可能做 6 份,所以答案是 5 。
对于第二个测试用例,您可以用 800 克配料 1 制作 8 份 A 菜,用 300 克配料 2 制作 30 份 B 菜,总共可以制作 38 份。
老汉使用到的是贪心的解题方式
本题是求在给定的配料中所能做出的最大菜肴数。
在对菜肴数求解的过程,肯定是需要比对是否可以做成,菜品数是否为最大,如果逐一去比对所有可能,时间上是不允许的,因此我们贪婪的去求当菜肴 A 制作0份~所能制作的最大份数时,分别能制作最多多少B菜肴,以及总和数最大的一个。
代码注释有详细过程
package ABC338_C_LeftoverRecipes; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); // 存放数据N int n = scan.nextInt(); // 存放数据Q int[] q = new int[n]; // 存放数据A int[] a = new int[n]; // 存放数据B int[] b = new int[n]; // 接收输入数据Q for (int i = 0; i < n; i++) { q[i] = scan.nextInt(); } // 接收输入数据A for (int i = 0; i < n; i++) { a[i] = scan.nextInt(); } // 接收输入数据B for (int i = 0; i < n; i++) { b[i] = scan.nextInt(); } // 存放不做B菜肴,只做A菜肴时,最多可以做几道A菜肴 int max_a = Integer.MAX_VALUE; for (int i = 0; i < n; i++) { if (a[i] != 0 && max_a > q[i] / a[i]) { max_a = q[i] / a[i]; } } // 存放最多可制作的菜肴份数 int max = 0; // 枚举A菜肴可制作的所有情况,求出当前情况最大菜肴数 for (int i = 0; i <= max_a; i++) { int max_b = Integer.MAX_VALUE; for (int j = 0; j < n; j++) { if (b[j] != 0 && max_b > (q[j] - i * a[j]) / b[j]) { max_b = (q[j] - i * a[j]) / b[j]; } } // 当有更大的份数时,存储该值 if (max < i + max_b) { max = i + max_b; } } // 输出答案max System.out.println(max); scan.close(); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。