首页 > 其他分享 >1465. 切割后面积最大的蛋糕

1465. 切割后面积最大的蛋糕

时间:2023-10-27 12:24:40浏览次数:35  
标签:std 切割 int res horizontalCuts long 蛋糕 1465 verticalCuts

1.题目介绍

矩形蛋糕的高度为 h 且宽度为 w,给你两个整数数组 horizontalCuts 和 verticalCuts,其中:
\(\text{horizontalcuts [i] 是从矩形蛋糕顶部到第 i 个水平切口的距离}\)
\(\text{verticalCuts [j] 是从赶形蛋糕的左侧到第 j 个贤盲切口的距离}\)
请你按数组 horizontalCuts 和 verticalCuts中提供的水平和竖直位置切割后,请你找出 面积面积最大 的那份蛋糕,并返回其 面积 。由于答案可能是一个很大的数字,因此需要将结果 对 \(10^9 + 7\) 取余 后返回。

image

image

image

2.题解(贪心算法)

问题转化

这里最重要的是要理解示例图,在我们将0和边界值也加入两数组后,构成的横/竖n条遍都可以通过平移与另一条竖/横构成一个矩形!!!所以问题也就转变成了分别求两个数组中间距最大的两个元素,然后我们就可以通过平移构成图中所有可能的切割区域。

就举个例子,这里的横(0->1 = 1, 1->3 = 2 3->4 = 1),竖(0->1 = 1, 1->2 = 1, 2->4 = 2, 4->5 = 1),分别取这里面长度最大的两个,也就是1->3(向下平移),2->4(向右平移)直到两者相较于一点,然后补充为矩形即可。
image

代码

1.我的代码

总体思路就是先将数组排序,然后将0和边界值分别加入两个数组,之后分别遍历数组找出间隔最大的一组计算出面积。

这里注意一个东西,题目说:由于答案可能是一个很大的数字,因此需要将结果 对 \(10^9 + 7\) 取余 后返回。这里我们就要考虑溢出的情况,我们会发现使用 return (res_w * res_h % 1000000007);依旧会导致double类型无法转化int的问题,使用 return (int)(res_w * res_h % 1000000007);依旧会导致溢出的问题,使用return (long long)(res_w * res_h % 1000000007);也会有溢出的问题?

这是为什么呢?这是因为(由运算符的优先级和结合性(左结合))先进行res_w * res_h 的乘法运算时是将其看做int类型进行运算的,得到的结果过大无法存储于int中导致溢出,也就算不到后面一步的求余运算和以及后面的类型转换了。

这里我们就可以这样写:return (int)((long long)res_w * res_h % 1000000007);这里现将res_w转化为long long类型,这样乘法运算就不会溢出,这里的int虽然可以省略(系统会隐式转换),但是为了表达清晰,这里特意标出。(注意:从较大类型(long long)转换为较小类型(int),有可能会发生数据截断,一般不推荐这么做)

//
// Created by trmbh on 2023-10-27.
//
#include<vector>
#include <algorithm>
#include <cmath>
#include <iostream>
class Solution {
public:
    int maxArea(int h, int w, std::vector<int>& horizontalCuts, std::vector<int>& verticalCuts) {
        sort(horizontalCuts.begin(),horizontalCuts.end());
        sort(verticalCuts.begin(),verticalCuts.end());
        horizontalCuts.insert(horizontalCuts.begin(), 0);
        horizontalCuts.push_back(h);
        verticalCuts.insert(verticalCuts.begin(),0);
        verticalCuts.push_back(w);
        int res_h= 0, res_w = 0;
        for (int i = 1; i < horizontalCuts.size(); i++){
            res_h = std::max(res_h, horizontalCuts[i] - horizontalCuts[i-1]);
        }
        for (int i = 1; i < verticalCuts.size(); i++){
            res_w = std::max(res_w, verticalCuts[i] - verticalCuts[i-1]);
        }
        return (int)(res_w * res_h % 1000000007);
    }
};

int main(){
    Solution solution;
    std::vector<int> arr_h = {5,2,6,3}, arr_v = {1, 4};
    std::cout << solution.maxArea(8,5,arr_h,arr_v) << std::endl;
}

2.力扣题解

这里使用了lambda表达式(求最大矩形长和宽的方式基本相同,用lambda表达式可简化代码),名为 calMax。这个 lambda 函数接受两个参数:一个整数向量的引用 (arr) 和一个整数 (boardr),然后返回一个整数。

他这里没有直接在数组里面加上0和边界值(尤其上首项加0,确实太浪费时间,所有后面的项都要向后推),而是将其单独拉出来,为了方便实用强化的for语句,加入了一个pre存储前一个元素;在最后的时候,再将边界值-pre和res比较,就将所有边均计算在内了。

class Solution {
public:
    int maxArea(int h, int w, std::vector<int>& horizontalCuts, vector<int>& verticalCuts) {
        int mod = 1e9 + 7;
        sort(horizontalCuts.begin(), horizontalCuts.end());
        sort(verticalCuts.begin(), verticalCuts.end());
        auto calMax = [](std::vector<int> &arr, int boardr) -> int {
            int res = 0, pre = 0;
            for (int i : arr) {
                res = std::max(i - pre, res);
                pre = i;
            }
            return std::max(res, boardr - pre);
        };
        return (long long)calMax(horizontalCuts, h) * calMax(verticalCuts, w) % mod;
    }
};

标签:std,切割,int,res,horizontalCuts,long,蛋糕,1465,verticalCuts
From: https://www.cnblogs.com/trmbh12/p/17792027.html

相关文章

  • 使用langchain与你自己的数据对话(一):文档加载与切割
    LangChain是一个基于大语言模型(如ChatGPT)用于构建端到端语言模型应用的Python框架。它提供了一套工具、组件和接口,可简化创建由大型语言模型(LLM)和聊天模型提供支持的应用程序的过程。LangChain可以轻松管理与语言模型的交互,将多个组件链接在一起,以便在不同的应用程序中使用......
  • MongoDB 日志切割三种方式
    MongoDB日志切割​MongoDB默认是不会进行切割日志的,除非我们配置了logRotate=rename,并且重启MongoDB服务,才会进行切割日志的,那么为了避免实际中我们一个日志文件过大,我们需要对日志进行切割,有两个办法:1.通过MongoDB管理命令进行切割使用该命令时需要在MongoDB运行......
  • Oracle集群升级迁移—老集群磁盘切割
    目录Oracle升级迁移剔除磁盘腾出存储LUNGRID用户登录,查询ASM磁盘剔除磁盘Oracle升级迁移目前有两套Oracle采用ADG+RAC架构,其中备库使用的为SUSE12.4目前已EOS,文件系统BFTFS与Oracle兼容性据说也有一定的问题,决定对现有的集群进行升级,升级后服务器统一采用SUSE12.5+EXT4文件系......
  • react native app 图标在安卓上内容被切割问题记录
    问题背景:reactnative开发app,设置的app图标在安卓中会被切割,导致周围的留白被切掉,看起来很奇怪。甚至有些文字内容被切割掉,显示不全。在不同手机上,icon可能会被切割成各种圆角,如果留白不够,内容可能会被切割。在iOS上icon也有相应的规范,比如需要1024尺寸等。解决方法:在查找......
  • Solution -「模拟赛」草莓蛋糕
      \(\max(a_x+a_y,b_y+b_x)\)的贡献形式不是独立的,并不好进行分析。考虑通过分类讨论将\(\max\)拆开。若令\(h_i=a_i-b_i\),\(h'_i=b_i-a_i\),可以发现若\(h_x\geqslanth'_y\)取值则为\(b_x+b_y\),反之亦然。  注意到\(h\)本身自带一个一维偏序关系,于......
  • spring boot实现切割分片上传
    文件上传是web开发中经常会遇到的springboot的默认配置为10MB,大于10M的是传不上服务器的,需要修改默认配置但是如果修改支持大文件又会增加服务器的负担。当文件大于一定程度时,不仅服务器会占用大量内存,而且http传输极可能会中断。可以采用切割分片上传html5提供的文件API中可......
  • 镭拓新款激光圆管切割机亮相第二十八届中国五金博览会
    编辑:镭拓激光一年一度的五金行业盛会——中国五金博览会即将在浙江永康国际会展中心隆重开幕,今年已经是第二十八届了,届时会有来自全国各地的制造业企业参展。这样的行业盛会怎么能少得了我们镭拓激光呢!镭拓激光将携全新设计的激光圆管切割机亮相第二十八届中国五金博览会。在本届展......
  • nginx日志切割-手动
    现有的日志都会存在access.log文件中,但是随着时间的推移,这个文件的内容会越来越多,体积会越来越大,不便于运维人员查看,所以我们可以通过把文件切割为多份不同的小文件作为日志,切割规则可以以天为单位,如果每天有几百G或者几个T的日志的话,则可以按需以每半天或者每小时对日志切......
  • 镭拓激光科普不锈钢管激光切割机设备在金属管材的应用
    编辑:镭拓激光金属管材的切割是很多中工业领域加工的一个重要环节,不锈钢管激光切割机在管材加工上具有高精度、高效率和高质量的切割效果,是不锈钢等金属管材切割加工的重要设备机器。本篇我们就来重点探讨一下不锈钢激光切割机在金属管材上的应用。不锈钢管凭借其良好的耐腐蚀性和美......
  • 三维五轴激光切割机在金属管材上的应用
    编辑:镭拓激光随着激光切割技术的不断发展与进步,三维激光切割机在金属材料加工上的应用越来越广受厂家欢迎。这种高度精度的激光切割技术能够快速实现高精度、高效率的材料切割。本篇我们就来探讨一下三维激光切割机在金属管材上的应用。三维激光切割机是作为一种高精密的激光切割设......