跳转至

3052. 最大化商品 🔒

题目描述

表:Inventory

+----------------+---------+ 
| Column Name    | Type    | 
+----------------+---------+ 
| item_id        | int     | 
| item_type      | varchar |
| item_category  | varchar |
| square_footage | decimal |
+----------------+---------+
item_id 是这张表中有不同值的列。
每一行包含 item id,item type,item category 和 sqaure footage。

Leetcode 仓库想要最大化它能够在 500,000 平方英尺的仓库中储存的商品数。他想要尽可能多地存储 主要 商品,然后用 剩下 的空间存储最大数量的 非主要 商品。

编写一个解决方案来找到能够在 500,000 平方英尺的仓库中存储 主要 和 非主要 商品的数量。输出商品类型 prime_eligible 和 not_prime,以及能储存商品的最大数量。

注意:

  • 商品 必须是一个整数。
  • 如果 not_prime 分类的数量是 0,你应当对这部分分类 输出 0 。

返回结果表,以商品数 升序 排序。

结果格式如下所示。

 

示例 1:

输入: 
Inventory 表:
+---------+----------------+---------------+----------------+
| item_id | item_type      | item_category | square_footage | 
+---------+----------------+---------------+----------------+
| 1374    | prime_eligible | Watches       | 68.00          | 
| 4245    | not_prime      | Art           | 26.40          | 
| 5743    | prime_eligible | Software      | 325.00         | 
| 8543    | not_prime      | Clothing      | 64.50          |  
| 2556    | not_prime      | Shoes         | 15.00          |
| 2452    | prime_eligible | Scientific    | 85.00          |
| 3255    | not_prime      | Furniture     | 22.60          | 
| 1672    | prime_eligible | Beauty        | 8.50           |  
| 4256    | prime_eligible | Furniture     | 55.50          |
| 6325    | prime_eligible | Food          | 13.20          | 
+---------+----------------+---------------+----------------+
输出: 
+----------------+-------------+
| item_type      | item_count  | 
+----------------+-------------+
| prime_eligible | 5400        | 
| not_prime      | 8           | 
+----------------+-------------+
解释: 
- prime-eligible 分类包括总计 6 件商品,总面积为 555.20 (68 + 325 + 85 + 8.50 + 55.50 + 13.20) 平方英尺。可以存放这 6 种物品的 900 件组合,总计 5400 件,占地 499,680 平方英尺。
- 对于 not_prime 分类,共有 4 件商品,总面积为 128.50 平方英尺。在减去 prime-eligible 商品使用的空间之后 (500,000 - 499,680 = 320),还有放 2 件 non-prime 商品的空间,在320平方英尺的面积内,共容纳 8 个 non-prime 商品。
输出表以商品数量降序排序。

解法

方法一:连接查询 + 合并

我们先计算出所有 prime_eligible 类型的物品的总面积,记录在 T 表的 s 字段中。

接下来,我们分别计算 prime_eligible 和 not_prime 类型的物品的数量。对于 prime_eligible 类型的物品,我们可以存储的份数是 $\lfloor \frac{500000}{s} \rfloor$,对于 not_prime 类型的物品,我们可以存储的份数是 $\lfloor \frac{500000 \mod s}{\sum \textit{s1}} \rfloor$。其中 $\sum \textit{s1}$ 是所有 not_prime 类型的物品的总面积。再分别乘上 prime_eligible 和 not_prime 类型的物品的数量,就是我们的结果。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Write your MySQL query statement below
WITH
    T AS (
        SELECT SUM(square_footage) AS s
        FROM Inventory
        WHERE item_type = 'prime_eligible'
    )
SELECT
    'prime_eligible' AS item_type,
    COUNT(1) * FLOOR(500000 / s) AS item_count
FROM
    Inventory
    JOIN T
WHERE item_type = 'prime_eligible'
UNION ALL
SELECT
    'not_prime',
    IFNULL(COUNT(1) * FLOOR(IF(s = 0, 500000, 500000 % s) / SUM(square_footage)), 0)
FROM
    Inventory
    JOIN T
WHERE item_type = 'not_prime';

评论