当前位置:   article > 正文

Atcoder ABC338 C - Leftover Recipes

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
  • 1
  • 2
  • 3
  • 4

样例二、

2
800 300
100 0
0 10
  • 1
  • 2
  • 3
  • 4

【样例输出】

样例一、

5
  • 1

样例二、

38
  • 1

【样例说明】

对于第一个测试用例,这台冰箱有 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();
	}
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/79732
推荐阅读
相关标签
  

闽ICP备14008679号