【贪心】力扣3218. 切蛋糕的最小总开销 I

news/2024/12/22 15:29:42 标签: leetcode, 算法

有一个 m x n 大小的矩形蛋糕,需要切成 1 x 1 的小块。

给你整数 m ,n 和两个数组:

horizontalCut 的大小为 m - 1 ,其中 horizontalCut[i] 表示沿着水平线 i 切蛋糕的开销。
verticalCut 的大小为 n - 1 ,其中 verticalCut[j] 表示沿着垂直线 j 切蛋糕的开销。
一次操作中,你可以选择任意不是 1 x 1 大小的矩形蛋糕并执行以下操作之一:

沿着水平线 i 切开蛋糕,开销为 horizontalCut[i] 。
沿着垂直线 j 切开蛋糕,开销为 verticalCut[j] 。
每次操作后,这块蛋糕都被切成两个独立的小蛋糕。

每次操作的开销都为最开始对应切割线的开销,并且不会改变。

请你返回将蛋糕全部切成 1 x 1 的蛋糕块的 最小 总开销。

示例 1:
输入:m = 3, n = 2, horizontalCut = [1,3], verticalCut = [5]

输出:13

解释:
在这里插入图片描述

沿着垂直线 0 切开蛋糕,开销为 5 。
沿着水平线 0 切开 3 x 1 的蛋糕块,开销为 1 。
沿着水平线 0 切开 3 x 1 的蛋糕块,开销为 1 。
沿着水平线 1 切开 2 x 1 的蛋糕块,开销为 3 。
沿着水平线 1 切开 2 x 1 的蛋糕块,开销为 3 。
总开销为 5 + 1 + 1 + 3 + 3 = 13 。

示例 2:
输入:m = 2, n = 2, horizontalCut = [7], verticalCut = [4]

输出:15

解释:
沿着水平线 0 切开蛋糕,开销为 7 。
沿着垂直线 0 切开 1 x 2 的蛋糕块,开销为 4 。
沿着垂直线 0 切开 1 x 2 的蛋糕块,开销为 4 。
总开销为 7 + 4 + 4 = 15 。

在这里插入图片描述

贪心

class Solution {
public:
    int minimumCost(int m, int n, vector<int>& horizontalCut, vector<int>& verticalCut) {
        int a = 1;
        int b = 1;
        sort(horizontalCut.begin(), horizontalCut.end(), greater<int>());
        sort(verticalCut.begin(), verticalCut.end(), greater<int>());
        int x = 0, y = 0;
        int ans = 0;
        while(x < m-1 && y < n-1){
            if(horizontalCut[x] > verticalCut[y]){
                ans += b * horizontalCut[x];
                a++;
                x++;
            }
            else{
                ans += a * verticalCut[y];
                b++;
                y++;
            }
        }
        
        while (x < horizontalCut.size()) {
            ans += b * horizontalCut[x];
            x++;
        }

        while (y < verticalCut.size()) {
            ans += a * verticalCut[y];
            y++;
        }
        return ans;
    }
};

这道题使用贪心算法是最高效的做法,我们观察题目,假设我们每一次沿着水平线都切到底,那么沿着该水平线切的次数就是垂直方向有多少块蛋糕,那么开销就要乘以垂直方向蛋糕的数量。那么也就是说我们应该优先沿着开销大的水平线切,否则放到后面切的话,可能该水平线切到底的开销就要乘以更多的倍数。

所以我们将horizontalCut和verticalCut进行降序排序,然后我们去寻找horizontalCut和verticalCut中的最大水平线开销来作为当前切哪一刀。当两个数组中的任意一个遍历完后,都会跳出while循环。由于另外一组数组还没有完全遍历,所以我们要继续计算剩余的开销。

在这道题中我们定义一个变量ans来记录切蛋糕的最小开销是多少,最后返回ans。


http://www.niftyadmin.cn/n/5795479.html

相关文章

WeakAuras NES Script(lua)

WeakAuras NES Script 修星脚本字符串 脚本1&#xff1a;NES !WA:2!TMZFWXX1zDxVAs4siiRKiBN4eV(sTRKZ5Z6opYbhQQSoPtsxr(K8ENSJtS50(J3D7wV3UBF7E6hgmKOXdjKsgAvZFaPTtte0mD60XdCmmecDMKruyykDcplAZiGPfWtSsag6myGuOuq89EVDV9wPvKeGBM7U99EFVVVV33VFFB8Z2TJ8azYMlZj7Ur3QDR(…

VMWare 的克隆操作

零、碎碎念 VMWare 的这个克隆操作很简单&#xff0c;单拎出来成贴的目的是方便后续使用。 一、操作步骤 1.1、在“源”服务器上点右键&#xff0c;选择“管理--克隆” 1.2、选择“虚拟机的当前状态”为基础制作克隆&#xff0c;如下图所示&#xff0c;然后点击“下一页” 1.3、…

梳理你的思路(从OOP到架构设计)_简介设计模式

目录 1、 模式(Pattern) 是较大的结构​编辑 2、 结构形式愈大 通用性愈小​编辑 3、 从EIT造形 组合出设计模式 1、 模式(Pattern) 是较大的结构 组合与创新 達芬奇說&#xff1a;簡單是複雜的終極形式 (Simplicity is the ultimate form of sophistication) —Leonardo d…

前端如何将pdf等文件传入后端

我们知道在js中我们可以通过&#xff1a; <input type"file" name"file" id"fileInput" accept"image/*">来输入文件。其中type指后端url&#xff0c;accept来限制传入类型。 前端通过表单形式将其传入后端 那么前端是怎么将…

在Excel中如果制作可以自动填充的序号,删除或者合并单元也可用

大家好&#xff0c;我是小鱼。在日常的办公中有时需要制作带序号的表格&#xff0c;这样可以通过序号来直观地看到有多少条信息&#xff0c;但是如果普通的批量添加序号的话&#xff0c;一旦我们删除或者合并某几行数据&#xff0c;前面的序号不会自动更新&#xff0c;序号显示…

在 Ubuntu 下通过 Docker 部署 PSQL 服务器

嗨&#xff0c;各位技术爱好者&#xff01;今天我们要聊的是如何在 Ubuntu 系统中通过 Docker 部署 PostgreSQL&#xff08;简称 PSQL&#xff09;服务器。对于那些还不熟悉 Docker 和 PSQL 的小伙伴&#xff0c;Docker 是一个开源的容器化平台&#xff0c;可以让你轻松构建、部…

Python毕业设计选题:基于Python的农产品销售系统的设计与实现_django

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 商家管理 产品类型管理 商家功能界面 系统首页…

基于Spring Boot的茶叶商城系统

一、系统概述 该系统旨在整合茶叶市场的资源&#xff0c;优化茶叶销售流程&#xff0c;提升茶叶商家的运营效率&#xff0c;同时为消费者提供一个方便、快捷的购茶渠道。通过线上商城的形式&#xff0c;将传统的茶叶销售模式与现代科技相结合&#xff0c;推动茶叶市场的数字化…