蓝桥杯算法题-图形排版

题目描述

小明需要在一篇文档中加入 N 张图片,其中第 i 张图片的宽度是 Wi,高度是 Hi。
  假设纸张的宽度是 M,小明使用的文档编辑工具会用以下方式对图片进行自动排版:

1. 该工具会按照图片顺序,在宽度 M 以内,将尽可能多的图片排在一行。该行的高度是行内最高的图片的高度。例如在 M=10 的纸张上依次打印 3x4, 2x2, 3x3 三张图片,则效果如下图所示,这一行高度为4。(分割线以上为列标尺,分割线以下为排版区域;数字组成的矩形为第x张图片占用的版面)
 
2. 如果当前行剩余宽度大于0,并且小于下一张图片,则下一张图片会按比例缩放到宽度为当前行剩余宽度(高度向上取整),然后放入当前行。例如再放入一张4x9的图片,由于剩余宽度是2,这张图片会被压缩到2x5,再被放入第一行的末尾。此时该行高度为5:

3. 如果当前行剩余宽度为0,该工具会从下一行开始继续对剩余的图片进行排版,直到所有图片都处理完毕。此时所有行的总高度和就是这 N 张图片的排版高度。例如再放入11x1, 5x5, 3x4 的图片后,效果如下图所示,总高度为11:


现在由于排版高度过高,图片的先后顺序也不能改变,小明只好从 N 张图片中选择一张删除掉以降低总高度。他希望剩余N-1张图片按原顺序的排版高度最低,你能求出最低高度是多少么?

输入:
第一行包含两个整数 M 和 N,分别表示纸张宽度和图片的数量。
  接下来 N 行,每行2个整数Wi, Hi,表示第 i 个图大小为 Wi*Hi。

对于30%的数据,满足1<=N<=1000
  对于100%的数据,满足1<=N<=100000,1<=M, Wi, Hi<=100

输出:
一个整数,表示在删除掉某一张图片之后,排版高度最少能是多少。

样例输入1:
4 3
2 2
2 3
2 2
样例输出1:
2
 

 思路:要删去一张图片,使高度最小,无非是遍历N张图片,判断第i个图片不选是否拥有更小的高度。

可以分割一下状态,例如第i行中图片j,判断不选图片j的高度,可以由三个状态组成:

①前i-1行的总高度,这是固定的,在遍历过程就可以知道;

②i+1行以后的总高度,这个要怎么得到呢,可以知道,i+1行开头肯定是新的照片k,我从那张照片k开始遍历到最后一张照片,所得的高度一定是确定的,可以设置一个数组t[i]保留i照片以及以后的高度。

③此时不选j,第i行的高度,想要求这个可以定义一个calc函数,实现向行中添加图片,直到添加完全部图片或者宽度已达最大,求出该行的高度(再加上t[i]就成了第i行以及以后所有行的总高度),为了实现calc函数,还得定义一个solve函数,solve函数的目的是判断加了一张图片,该行的宽度和高度变化。

很明显用了动态规划的思想,他有状态转移关系,问题被细分为了多个子问题,把处理全部细分为了处理行。

这种方法适用于一些题目,题目中总体只修改了部分结构,只需要处理那部分被修改的状态,其余的部分可以通过处理得到,视为常量。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int m,n,h[N],w[N],t[N];
void solve(int i,int& W,int& H){if(W+w[i]<=m){ H=max(H,h[i]); }else{H=max(H,(h[i]*(m-W)+w[i]-1)/w[i]);}W=min(m,W+w[i]);
} 
int calc(int i,int W,int H){while(i<n&&W<m)solve(i++,W,H); return H+t[i];
}
int main(){cin>>m>>n;for(int i=0;i<n;i++)cin>>w[i]>>h[i];for(int i=n-1;i>=0;i--)t[i]=calc(i,0,0);int res=t[0],pre_h=0,W=0,H=0;for(int i=0;i<n;i++){int tmp=calc(i+1,W,H);res=min(res,pre_h+tmp);solve(i,W,H);if(W==m)pre_h+=H,W=0,H=0;} cout<<res<<endl;
} 

加了注释后: 

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int m,n,h[N],w[N],t[N];//m为每行最大宽度,n为图片数量,h为每张图片对应高度,w为每张图片对应宽度,t[i]为以i图片为开始,与他以后所有的图片组合,形成的最小高度(一定是以i为行头开始)
void solve(int i,int& W,int& H){//找出加入i元素后,该行的高度和宽度所发生的变化 if(W+w[i]<=m){//没超出最大宽度 H=max(H,h[i]); }else{H=max(H,(h[i]*(m-W)+w[i]-1)/w[i]);//为什么要加w[i]-1,因为他要向上取整,所以要加一个小数,即(w[i]-1)/w[i]}W=min(m,W+w[i]);
} 
int calc(int i,int W,int H){//求出加入i以及他后边所有图片后,总高度的变化 while(i<n&&W<m)solve(i++,W,H);//只要算一行的,另起一行的可以直接由t[i]得到 return H+t[i];//为什么这里是H+t[i],因为之前的一行可能已经有照片了,我先填满那一行,拿到那一行的高度即H,然后之后的元素就另起一行了,对应t[i],所以t[i]是需要预处理的,所以总的高度为H+t[i] 
}
int main(){cin>>m>>n;for(int i=0;i<n;i++)cin>>w[i]>>h[i];for(int i=n-1;i>=0;i--)t[i]=calc(i,0,0);//W=0,H=0,说明要求的是以i照片开头的,与它以后所有的图片组合形成的最小高度,预处理阶段,不预处理,以后可能有重复的求解过程int res=t[0],pre_h=0,W=0,H=0;//res先取t[0],是代表所有图片都取了后它的高度, pre_h为 之前已经统计了的行的高度,正在统计的不算 for(int i=0;i<n;i++){int tmp=calc(i+1,W,H);//计算出加入i+1以及之后的所有图片后,总高度的变化,不包括i,这就对应了删除一张图片的思想 res=min(res,pre_h+tmp);//前者为之前统计出的最小高度,后者为不要i照片的最小高度 solve(i,W,H);//加入i照片if(W==m)pre_h+=H,W=0,H=0;//此时已经充满一行,那就得另起一行了,所以pre_h要+H,H和W要清零 } cout<<res<<endl;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/292253.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「Android高级工程师」BAT大厂面试基础题集合-下-Github标星6-5K

C、 com.android.provider.contact D、 com.android.provider.contacts 11.下面关于ContentProvider描述错误的是&#xff08;&#xff09;。 A、 ContentProvider可以暴露数据 B、 ContentProvider用于实现跨程序共享数据 C、 ContentProvider不是四大组件 D、 ContentP…

与webpack类似的工具还有哪些?区别?

文章目录 一、模块化工具二、详细对比RollupParcelSnowpackVitewebpack 参考文献 一、模块化工具 模块化是一种处理复杂系统分解为更好的可管理模块的方式 可以用来分割&#xff0c;组织和打包应用。每个模块完成一个特定的子功能&#xff0c;所有的模块按某种方法组装起来&a…

stitcher类实现多图自动拼接

效果展示 第一组&#xff1a; 第二组&#xff1a; 第三组&#xff1a; 第四组&#xff1a; 运行代码 import os import sys import cv2 import numpy as npdef Stitch(imgs,savePath): stitcher cv2.Stitcher.create(cv2.Stitcher_PANORAMA)(result, pano) stitcher.st…

P-MapNet:Far-seeing Map Generator Enhanced by both SDMap and HDMap Priors

主页&#xff1a;homepage 参考代码&#xff1a;P-MapNet 动机与出发点 在感知系统中引入先验信息是可以提升静态元素感知网络的上限的&#xff0c;这篇文章对SD地图采用栅格化表示&#xff08;也就是图像形式&#xff09;&#xff0c;之后用CNN网络去抽取栅格化SD地图的信息&…

[技术笔记] Flash选型之基础知识芯片分类

1、按照接口分类 分为 Serial串口Flash 和 Parallel并口Flash&#xff1b; 市场大量使用Serial Flash&#xff1b;价格便宜&#xff1b;已满足系统对数据读写速度的要求&#xff1b; Serial Flash已经可以代表 NOR Flash&#xff1b; 小知识&#xff1a; 1&#xff09;在…

CVPR 2024 | 风格迁移和人像生成汇总!扩散模型diffusion用于经典AIGC方向

风格迁移 1、DEADiff: An Efficient Stylization Diffusion Model with Disentangled Representations 基于文本到图像扩散模型在迁移参考风格方面具有巨大潜力。然而&#xff0c;当前基于编码器的方法在迁移风格时显著损害了文本到图像模型的文本可控性。本文提出DEADiff来解决…

54 npm run serve 和 npm run build 输出的关联和差异

前言 通常来说 我们开发的时候一般会用到的命令是 “npm run serve”, “npm run build” 前者会编译当前项目, 然后将编译之后的结果以 node 的形式启动一个服务, 暴露相关业务资源, 因此 我们可以通过 该服务访问到当前项目 后者是编译当前项目, 然后做一下最小化代码的优…

(八)目标跟踪中参数估计(似然、贝叶斯估计)理论知识

目录 前言 一、统计学基础知识 &#xff08;一&#xff09;随机变量 &#xff08;二&#xff09;全概率公式 &#xff08;三&#xff09;高斯分布及其性质 二、似然是什么&#xff1f; &#xff08;一&#xff09;概率和似然 &#xff08;二&#xff09;极大似然估计 …

牛客NC153 信封嵌套问题【中等 动态规划,最长递增子序列 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/9bf77b5b018d4d24951c9a7edb40408f 相同的题目&#xff1a; https://www.lintcode.com/problem/602 思路 本质是求最长子序列问题envelopes 先按 w 升序排序&#xff0c;再按 h 降序 排序&#xff0c;只需考虑h…

深入探讨分布式ID生成方案

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起进步&am…

当代深度学习模型介绍--循环神经网络(RNNs)

AI大模型学习 方向一&#xff1a;AI大模型学习的理论基础 模型和应用的多样化&#xff1a;随着研究的深入&#xff0c;深度学习领域出现了多种创新的模型架构&#xff1a; 卷积神经网络&#xff08;CNNs&#xff09;专门针对图像处理任务进行了优化&#xff0c;通过模拟生物视…

node.js项目初始化操作

项目环境Vscode 1.新建一个文件夹node.js(xx.js) 2.右键点击node.js&#xff0c;点击打开终端 我在VScode打开终端 输入npm init初始化项目没反应。 解决方法&#xff1a;进入文件夹node.js&#xff0c;出入cmd跳转到终端 重新输入npm init命令 正确结果如下图 后续命令按下…

卫星影像监测非农化,非粮化在农业中的应用

一、引言 随着卫星遥感技术的发展&#xff0c;卫星影像在农业领域的应用越来越广泛。然而&#xff0c;随着城市化进程的加速和农业结构的调整&#xff0c;卫星影像观测的非农化、非粮化现象也越来越突出。本文将重点探讨卫星影像观测非农化、非粮化的原因、影响以及应对策略。 …

[linux] AttributeError: module ‘transformer_engine‘ has no attribute ‘pytorch‘

[BUG] AttributeError: module transformer_engine has no attribute pytorch Issue #696 NVIDIA/Megatron-LM GitHub 其中这个答案并没有解决我的问题&#xff1a; import flash_attn_2_cuda as flash_attn_cuda Traceback (most recent call last): File "<stdi…

Day62-Nginx四层负载均衡及结合7层负载均衡实践

Day62-Nginx四层负载均衡及结合7层负载均衡实践 1. 什么是四层负载均衡&#xff1f;2. 四层负载均衡的常用场景3. 百万并发百亿PV大规模架构4. L4和L7的区别及常用软件。5. lvs、nginx、haproxy区别6. nginx四层负载均衡&#xff08;tcp/ip&#xff0c;ip:port&#xff09;7. n…

深入理解element-plus table二次封装:从理论到实践的全面指南

前言 在许多中后台管理系统中&#xff0c;表格占据着半壁江山&#xff0c;如果使用element plus组件库&#xff0c;那么少不了要用到table组件&#xff0c;可是table组件的功能过于基础&#xff0c;因此&#xff0c;我在table组件的实现基础之上进一步封装&#xff0c;从而实现…

外贸独立站seo优化方案

对于外贸独立站而言&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;是吸引潜在客户、提升品牌曝光度和增加销售量的关键之一。但是&#xff0c;由于竞争激烈和市场的多样性&#xff0c;要想在搜索引擎上取得好的排名并非易事。本文将介绍一些外贸独立站SEO的有效方法&…

Kotlin 中的类和构造方法

Kotlin 中的类与接口和 Java 中的类与接口还是有区别的。例如&#xff0c;Koltin 中的接口可以包含属性声明&#xff0c;与 Java 不同的是。Kotlin 的声明默认是 final 和 public 的。此外&#xff0c;嵌套的类默认并不是内部类&#xff1a;它们并没有包含对其它外部类的隐式引…

QA:ubuntu22.04.4桌面版虚拟机鼠标丢失的解决方法

前言 在Windows11中的VMWare Workstation17.5.1 Pro上安装了Ubuntu22.04.4&#xff0c;在使用过程中发现&#xff0c;VM虚拟机的鼠标的光标会突然消失&#xff0c;但鼠标其他正常&#xff0c;就是光标不见了&#xff0c;下面是解决办法。 内容 如下图&#xff0c;输入mouse&a…

测试图片可否直接粘贴进csdn,后期删除

java图书管理系统mysqlswing版本 V1.0.1版 P1&#xff0c;简介项目功能&#xff1a; 运行主函数运行程序&#xff0c;进入管 理系统的登录界面