Atcoder ABC338 C - Leftover Recipes

Leftover Recipes(剩下的食谱)

时间限制: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();
	}
}

你可能感兴趣的:(Java算法题解,java,贪心算法,算法)