Leetcode3218. 切蛋糕的最小总开销 I

题目描述:

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

给你整数 mn 和两个数组:

  • horizontalCut 的大小为 m - 1 ,其中 horizontalCut[i] 表示沿着水平线 i 切蛋糕的开销。
  • verticalCut 的大小为 n - 1 ,其中 verticalCut[j] 表示沿着垂直线 j 切蛋糕的开销。

一次操作中,你可以选择任意不是 1 x 1 大小的矩形蛋糕并执行以下操作之一:

  1. 沿着水平线 i 切开蛋糕,开销为 horizontalCut[i]
  2. 沿着垂直线 j 切开蛋糕,开销为 verticalCut[j]

每次操作后,这块蛋糕都被切成两个独立的小蛋糕。

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

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

代码思路:

  1. 初始化结果
    • 首先,将horizontalCutverticalCut中所有切割位置的成本相加,得到初始的结果res。这表示仅仅进行所有给定的水平切割和垂直切割的成本总和。
  2. 计算交叉切割的额外成本
    • 接下来,代码通过两层嵌套循环遍历每一个水平切割位置hc和每一个垂直切割位置vc
    • 对于每一对交叉的切割(即一个水平切割和一个垂直切割),它们会在矩形的某个位置相交。在这个相交点,选择水平切割成本hc和垂直切割成本vc中的较小值作为交叉切割的额外成本(因为交点只会被切割一次,无论两个方向的成本如何,实际发生的成本是两者中的较小值)。
    • 将这个较小值累加到res中。
  3. 返回结果
    • 最后,返回累加后的res,它代表了进行所有给定切割以及所有交叉切割所需的最小成本总和。

代码实现:

cpp 复制代码
class Solution {
public:
    int minimumCost(int m, int n, vector<int> &horizontalCut, vector<int> &verticalCut) {
        int res = std::accumulate(horizontalCut.begin(), horizontalCut.end(), 0) +
                  std::accumulate(verticalCut.begin(), verticalCut.end(), 0);
        for (const auto &hc: horizontalCut)
            for (const auto &vc: verticalCut)
                res += std::min({hc, vc});
        return res;
    }
};
相关推荐
小白羊丨31 分钟前
如何诊断 Prompt 模板导致的效果下降?
人工智能·算法·prompt
一木 之林1 小时前
五、C++ 新特性、关键字与编译原理(进阶)(二)
java·开发语言·c++
OPEN-F2 小时前
C++11/14新特性精讲:移动语义与智能指针实战
开发语言·c++·算法
闭月之泪舞2 小时前
C++编程学习
c++·学习
lisin-lee-cooper2 小时前
【leetcode658】有序数组找出k个最接近x的数
java·数据结构·算法
sunburn-2 小时前
Java堆(Heap)详解与实战教学
java·开发语言·数据结构·ide·算法
智碳能碳管理平台3 小时前
工业能耗台账标准化:能碳管理系统的数据口径怎么设计
算法·能碳管理系统·智碳能碳管理平台·企业能碳管理系统·碳排放核算软件·绿色工厂申报saas·能碳管理平台
带多刺的玫瑰3 小时前
Leecode#15刷题之三数之和
算法·leetcode·职场和发展
圣保罗的大教堂3 小时前
leetcode 877. 石子游戏 中等
leetcode
哭泣方源炼蛊3 小时前
并查集进阶 P1(带权并查集,并查集分类)
数据结构·c++·算法·二进制·带权并查集