标题:图形排版

小明需要在一篇文档中加入 N 张图片,其中第 i 张图片的宽度是 Wi,高度是 Hi。

假设纸张的宽度是 M,小明使用的文档编辑工具会用以下方式对图片进行自动排版:

1. 该工具会按照图片顺序,在宽度 M 以内,将尽可能多的图片排在一行。该行的高度是行内最高的图片的高度。例如在 M=10 的纸张上依次打印 3x4, 2x2, 3x3 三张图片,则效果如下图所示,这一行高度为4。(分割线以上为列标尺,分割线以下为排版区域;数字组成的矩形为第x张图片占用的版面)

0123456789

111
111 333
11122333
11122333

2. 如果当前行剩余宽度大于0,并且小于下一张图片,则下一张图片会按比例缩放到宽度为当前行剩余宽度(高度向上取整),然后放入当前行。例如再放入一张4x9的图片,由于剩余宽度是2,这张图片会被压缩到2x5,再被放入第一行的末尾。此时该行高度为5:

0123456789

    44

111 44
111 33344
1112233344
1112233344

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

0123456789

    44

111 44
111 33344
1112233344
1112233344
5555555555
66666
66666777
66666777
66666777
66666777

现在由于排版高度过高,图片的先后顺序也不能改变,小明只好从 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

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

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

样例输出:
2

另一个示例,
样例输入:
2 10
4 4
4 3
1 3
4 5
2 1
2 3
5 4
5 3
1 5
2 4

样例输出:
17

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 2000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是:Main,否则按无效代码处理。

PS:
其实就是暴力大法,加一点动态规划(可能都算不上是动态规划,递推?)

 package 第五次模拟;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import java.util.StringTokenizer;public class Demo10图形排版 {public static void main(String[] arg) {solve();}static    StringTokenizer ST;static   BufferedReader BR;static    PrintWriter PW;static   String next() {while(ST == null || !ST.hasMoreTokens()) {try {ST = new StringTokenizer(BR.readLine());}catch (Exception e) {// TODO: handle exceptionthrow new RuntimeException(e);}}return ST.nextToken();}static int nextInt() {return Integer.parseInt(next());}public    static void solve() {BR = new BufferedReader(new InputStreamReader(System.in));PW = new PrintWriter(System.out);int m = nextInt(), n = nextInt();Pair a[] = new Pair[n + 10];Triple cr[] = new Triple[n + 10];cr[0] = new Triple();//正向处理出加到第i块的状态,Triple记忆第i块右下坐标(x,y)和第i块缩放后的高度hfor(int i = 1; i <= n; i++) {//创建Triple tmp = new Triple(cr[i-1]);//如果这一行装不下,就置零换行if(tmp.x == m) tmp.x = tmp.h = 0;//新建输入的宽高a[i] = new Pair(nextInt(), nextInt());cr[i] = new Triple();Pair b = Change(a[i], m - tmp.x);//保存当前的位置cr[i].x = tmp.x + b.x;cr[i].h = Math.max(tmp.h, b.y);cr[i].y = cr[i].h + tmp.y - tmp.h;}Triple A[] = new Triple[m];Triple B[] = new Triple[m];for(int i = 0; i < m; i++) {A[i] = new Triple();B[i] = new Triple();}int ans = cr[n].y;//把每一个都尝试一下for(int i = n; i >= 1; i--) {//处理删除第i块的答案ahTriple pre = cr[i-1];int ah;if(pre.x == m) {ah = pre.y + B[0].y;} else {ah = pre.y - pre.h + B[pre.x].y - B[pre.x].h + Math.max(pre.h, B[pre.x].h);}ans = Math.min(ans, ah);//逆向DP,处理出第i至n块从(0,j)位置开始放置for(int j = 0; j < m; j++) {Pair b = Change(a[i], m - j);Triple tmp;//放完这个我就要换行if(j + b.x == m) tmp = new Triple(0, B[0].y, 0);//如果不换行,还是这个else tmp = new Triple(B[j + b.x]);A[j].h = Math.max(b.y, tmp.h);A[j].y = A[j].h + tmp.y - tmp.h;}for(int j = 0; j < m; j++)B[j] = new Triple(A[j]);}PW.print(ans);PW.close();}//a的x小就返回a,否则返回static Pair Change(Pair A, int x) {if(A.x <= x) return new Pair(A);return new Pair(x, (A.y * x + A.x - 1) / A.x);}}class Pair implements Comparable<Pair> {int x, y;Pair() { }Pair(Pair A) { x = A.x; y = A.y; }Pair(int x, int y) {this.x = x; this.y = y;}@Overridepublic int compareTo(Pair A) {return x == A.x ? y - A.y : x - A.x;}}class Triple {int x, y, h;Triple() {}Triple(int x, int y, int h) {this.x = x; this.y = y; this.h = h;}Triple(Triple A) {x = A.x; y = A.y; h = A.h;}@Overridepublic String toString() {return String.valueOf(x) + " " + String.valueOf(y) + " " + String.valueOf(h);}}

Java实现第八届蓝桥杯图形排版相关推荐

  1. java中图片排版_Java实现第八届蓝桥杯图形排版

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

  2. java画图排版_Java实现第八届蓝桥杯图形排版

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

  3. 蓝桥杯—图形排版—暴力破解

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

  4. Java实现第八届蓝桥杯青蛙跳杯子

    青蛙跳杯子 题目描述 X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色.X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去.如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有 ...

  5. Java实现第八届蓝桥杯拉马车

    拉马车 题目描述 小的时候,你玩过纸牌游戏吗? 有一种叫做"拉马车"的游戏,规则很简单,却很吸引小朋友. 其规则简述如下: 假设参加游戏的小朋友是A和B,游戏开始的时候,他们得到的 ...

  6. Java实现第八届蓝桥杯日期问题

    日期问题 题目描述 小明正在整理一批历史文献.这些历史文献中出现了很多日期.小明知道这些日期都在1960年1月1日至2059年12月31日.令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/ ...

  7. Java实现第八届蓝桥杯兴趣小组

    兴趣小组 为丰富同学们的业余文化生活,某高校学生会创办了3个兴趣小组 (以下称A组,B组,C组). 每个小组的学生名单分别在[A.txt],[B.txt]和[C.txt]中. 每个文件中存储的是学生的 ...

  8. Java实现第八届蓝桥杯魔方状态

    魔方状态 题目描述 二阶魔方就是只有2层的魔方,只由8个小块组成. 如图p1.png所示. 小明很淘气,他只喜欢3种颜色,所有把家里的二阶魔方重新涂了颜色,如下: 前面:橙色 右面:绿色 上面:黄色 ...

  9. Java实现第八届蓝桥杯分巧克力

    分巧克力 题目描述 儿童节那天有K位小朋友到小明家做客.小明拿出了珍藏的巧克力招待小朋友们. 小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形. 为了公平起见,小明需要从这 N 块巧 ...

最新文章

  1. Tempdb数据库详细介绍
  2. c++ 遍历所有点且距离最短_C/C++ 图的最短路径 Dijkstra 算法
  3. 【转】C#开发PACS医学影像处理系统(三):界面布局之工具栏
  4. git clone时出现gnutls_handshake() failed: The TLS connection was non-properly terminated.
  5. 软件测试面试题!收藏起来,每天看一看,月薪20K!
  6. OpenGL基础23:平行光与点光源
  7. presto 正则提取函数
  8. ubuntu安装libjasper.so.1,libpng12.so.0
  9. (五)比赛中的CV算法(上2)目标检测初步:神经网络及优化方法
  10. 测井储层参数预测+人工智能方法
  11. Google地图实时轨迹
  12. ubuntu18.04 虚拟机重启后变成只读模式,怎么恢复?
  13. Codeforces Gym 101174 B. Bribing Eve
  14. 精英反向黄金正弦鲸鱼算法-附代码
  15. orcale中like用法详解
  16. 《嵌入式系统原理与应用》 |(三) ARM-Cortex M3处理器 知识梳理
  17. 计算机二级vb考试教材,计算机二级考试VB基础题教材.doc
  18. GPU/CPU性能天梯图
  19. 如何垂直居中对齐CSS[转载]
  20. 【前端学习-25】【day04】正则表达式、表单验证、用户名验证

热门文章

  1. 用u盘做启动盘安装系统后如何删除PE系统
  2. ss 命令查看连接数
  3. JS9day(BOM对象模型,setTimeout定时器,JS单线程执行机制,location对象,swiper插件,localStorage本地存储,购物车案例升级版,学习信息案例(本地存储))
  4. 在Unity中创建基于Node节点的编辑器 (一)
  5. ChatGPT在智能投顾领域应用探讨
  6. 王者荣耀助手服务器繁忙请稍后重试,王者荣耀微信提示网络繁忙/登录失败如何解决...
  7. 华为网络设备-三层Eth-trunk配置
  8. 喜欢一站式服务?欢go成全你
  9. jQuery中的append 和appendTo方法
  10. 2021-2027中国电气设备监测市场现状及未来发展趋势