标题:图形排版

小明需要在一篇文档中加入 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();

}

staticStringTokenizer ST;

staticBufferedReader BR;

staticPrintWriter PW;

staticString next() {

while(ST == null || !ST.hasMoreTokens()) {

try {

ST = new StringTokenizer(BR.readLine());

}catch (Exception e) {

// TODO: handle exception

throw new RuntimeException(e);

}

}

return ST.nextToken();

}

static int nextInt() {

return Integer.parseInt(next());

}

publicstatic 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块缩放后的高度h

for(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块的答案ah

Triple 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 {

int x, y;

Pair() { }

Pair(Pair A) { x = A.x; y = A.y; }

Pair(int x, int y) {

this.x = x; this.y = y;

}

@Override

public 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;

}

@Override

public String toString() {

return String.valueOf(x) + " " + String.valueOf(y) + " " + String.valueOf(h);

}

}

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

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

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

  2. Java实现第八届蓝桥杯图形排版

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

  3. 1229. 日期问题 Java题解 (枚举) 【第八届蓝桥杯省赛C++B组,JAVA B组】

    输入样例: 02/03/04 输出样例: 2002-03-04 2004-02-03 2004-03-02 解题思路: 可以顺着题意将三个数所有可能组成的情况枚举出来,并判断是否为合法的日期,将符合条 ...

  4. 2019蓝桥杯Java决赛题答案_2019-01-15 第八届蓝桥杯javaB组第二题

    题目: 标题:纸牌三角形 A,2,3,4,5,6,7,8,9 共9张纸牌排成一个正三角形(A按1计算).要求每个边的和相等. 下图就是一种排法(如有对齐问题,参看p1.png). A 9 6 4 8 ...

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

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

  6. 2017年 第八届蓝桥杯 Java B组真题整理

    2017年 第八届蓝桥杯 Java B组真题整理 1.购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞.这不,XX大促销又 ...

  7. 49-2017年第八届蓝桥杯国赛试题及详解(Java本科B组)

    蓝桥杯历年真题题目及题解目录汇总(推荐) 蓝桥杯算法模板常用套路及API等个人总结 ---------------------------------------------------------- ...

  8. 第八届蓝桥杯真题解析javaC组

    第八届蓝桥杯真题解析javaC组 文章目录 ***第八届蓝桥杯真题解析javaC组*** 前言 A.外星日历 B.兴趣小组 C.纸牌三角形 D.承压计算 E.杨辉三角 F.最大公共子串 G.Excel ...

  9. 第八届蓝桥杯个人赛赛后总结

    前言:2017年5月27日,第八届蓝桥杯个人赛C/C++大学A.B.C组.Java大学A.B.C组共六个小组决赛在北京举行.对于此次比赛,有过欢乐也有过遗憾,原本没打算写赛后总结,但是指导老师要求我们 ...

最新文章

  1. 如何征服Webpack 4并构建一个出色的React应用
  2. 华为手机升级回退_华为鸿蒙OS 2.0手机开发者Beta版支持Mate 30/P40系列OTA升级
  3. 【Cocos2d-X开发笔记】第一期 Cocos2d-X的环境搭建
  4. mybatis错误之配置文件属性配置问题
  5. ImportError: No module named google.protobuf.internal
  6. iou画 yolov3_专栏 | 【从零开始学习YOLOv3】4. YOLOv3中的参数进化
  7. 017-通过govendor管理依赖包
  8. html兼容webki,评IE10对HTML5的完美支持
  9. tkinter # If this fails your Python may not be configured for Tk解决方法
  10. 阿里日马云开启直播首秀,谈年轻人压力大:一句话给“骂”醒了!
  11. 张孝祖的第一次作业展示
  12. System学习笔记001---WIN10 win10按哪里哪里出现蓝色框
  13. 03 ZooKeeper底层原理剖析与命令实战
  14. Netty5 Write和Flush事件处理过程_源码讲解
  15. 探索社群系统ThinkSNS品牌10周年!
  16. 汽车毫米波雷达测试与测量解决方案
  17. 二叉树的非递归遍历算法
  18. 485终端电阻的重要性
  19. 如何把录音生成二维码,用微信扫一下就能听?分享语音音频转二维码的方法和技术原理
  20. ubuntu txt文件打开乱码怎么恢复正常

热门文章

  1. 安装虚拟机提示“无法安装服务VMAuthdService”,请确保您有足够的权限安装系统服务
  2. 快速删除txt文本数据中的某一列
  3. 前端三剑客 - JavaScript
  4. 哪款蓝牙耳机性价比最高?2022年热销蓝牙耳机推荐
  5. fiddler everywhere断点使用教程
  6. Java 原码反码补码
  7. 计算机网络在农业技术方面的应用,浅析计算机网络技术在农业中的应用.pdf
  8. vue中使用axios跨域请求
  9. 老家养牛比你在外面漂着舒服多了?
  10. debug 堆栈破坏 错误在他处