题目:

生日礼物 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description: BF的生日快到了,这一次,小东决定为BF送一份特别的生日礼物为其庆生。作为高智商中的佼佼者,BF在国外求学,因此小东无法与之一起庆生。小东计划送一个生日卡片,并通过特别的包装让BF永远难忘。

她决定把卡片套装在一系列的信封A = {a1,  a2,  …,  an}中。小东已经从商店中购买了很多的信封,她希望能够用手头中尽可能多的信封包装卡片。为防止卡片或信封被损坏,只有长宽较小的信封能够装入大些的信封,同尺寸的信封不能套装,卡片和信封都不能折叠。

小东计算了邮寄的时间,发现她的时间已经不够了,为此找你帮忙包装,你能帮她吗? 输入 输入有若干组,每组的第一行包含三个整数n, w, h,1<=n<=5000, 1<=w, h<=10^6,分别表示小东手头的信封数量和卡片的大小。紧随其后的n行中,每行有两个整数wi和hi,为第i个信封的大小,1<=wi, hi<=10^6。 输出 对每组测试数据,结果第一行中输出最多能够使用的信封数量,结果第二行中按使用顺序输出信封的编号。由于小东有洁癖,她对排在前面的信封比较有好感,若有多个信封可用,她喜欢用最先拿到的信封。另外别忘了,小东要求把卡片装入能够装的最小信封中。 如果卡片无法装入任何信封中,则在单独的行中输出0。

样例输入 2 1 1 2 2 2 2 3 3 3 5 4 12 11 9 8​ 样例输出 1 1 3 1 3 2

解题思路:
具体思路如图片所示,首先针对所有的数据进行排序,排序的依据是信封的面积,然后利用动态规划的备忘录法,依次向前寻找其能存放的列,并将该数据与那一列组成新的一列(当前方多个列满足要求,并且前方列的高度相同时,取最前面的),最后输出的结果就是最优解。

详细的代码如下所示:(本人采用了Java来解,不过思路差不多,各位可以自由尝试)

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;public class GiftProblem {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while(scanner.hasNextInt()){int num = scanner.nextInt();int w = scanner.nextInt();int h = scanner.nextInt();int[][] temps = new int[num][4];int nums = 0;for (int i = 0; i < num; i++) {int tempWidth=scanner.nextInt();int tempHigh=scanner.nextInt();if (tempWidth>w && tempHigh>h) {temps[nums][0] = tempWidth;temps[nums][1] = tempHigh;temps[nums][2] = i+1;temps[nums][3] = temps[nums][0]*temps[nums][1];nums++;}}findTemp(Arrays.copyOfRange(temps, 0, nums),nums,w,h);}}public static void findTemp(int[][] temps, int num, int w, int h) {//首先对所有的数据进行排序,以面积的形式进行排序Arrays.sort(temps,new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {if (o1[3]>o2[3]) return 1;if (o1[3]<o2[3]) return -1;return 0;}});List<List<int[]>> resultList = new ArrayList<>();List<int[]> headList = new ArrayList<>();headList.add(new int[]{w,h,1});resultList.add(headList);for (int i = 1; i <= num; i++) {int levelNow = 0;for (int j = i-1; j >= 0; j--) {List<int[]> list = resultList.get(j);int oldLevel = list.size();if(oldLevel<levelNow-1) break;int[] oldTop = list.get(oldLevel-1);if (oldTop[0]<temps[i-1][0] && oldTop[1]<temps[i-1][1]) {List<int[]> tempList = new ArrayList<>();tempList.addAll(list);tempList.add(temps[i-1]);//更新resultList,保存最优值if (resultList.size()==i+1) resultList.remove(i);resultList.add(tempList);levelNow = oldLevel+1;}}}System.out.println("最多可以包裹的信封数:\t"+(resultList.get(num).size()-1));for (int i = 1; i < resultList.get(num).size(); i++) {System.out.print(resultList.get(num).get(i)[2]+" ");}}
}

转载请注明本博客地址,多谢。

编码-京东实习笔试编程题-生日礼物-动态规划相关推荐

  1. 编码-京东实习笔试编程题-糖果问题-动态规划

    问题 某糖果公司专门生产儿童糖果,它最受儿童欢迎的糖果有A1.A2两个序列,均采用盒式包装.包装好的A1类糖果体积为一个存储单位,而包装好的A2类糖果体积正好是A1类的两倍. 这两类糖果之所以广受儿童 ...

  2. 【编码】对qsort函数的稳定排序优化-京东实习笔试编程题(一)-2016.04.08

    今晚在做京东的笔试题时,使用了qsort函数,由于排序结果不稳定,导致一直无法ac.后来在待排序的结构体中多加入一个关键字段,较简单的解决了问题. 题目: 生日礼物 Time Limit: 2000/ ...

  3. 招商银行信用卡中心21届实习笔试编程题

    第一题 镜像字符串 给一个序列x,如果x和它的逆序列y的每一位都是镜像关系,则输出"yes"否则输出"no" 1镜像1,2镜像5,3镜像8,4镜像7,6镜像9. ...

  4. 京东校招java笔试题_2017京东校招笔试编程题:进制转换、辗转相除

    题目描述 时间限制:C/C++语言 1000MS 其他语言:3000MS 内存限制:C/C++语言 65536KB 其他语言:589824KB 题目内容:尽管是一个CS专业的学生,小B的数学基础很好并 ...

  5. 京东校招java面试题_京东2018校招编程题解答(Java)

    写在前面 本文主要是解答这次校招中京东的笔试编程题,这次京东的笔试编程题比较难,涉及KMP算法.manacher算法等.文中的解法也是在观看了左神(左程云)9月20号在牛客网的直播后,自己花时间写出来 ...

  6. python算法预测风险等级_一般算法水平到底什么样子才能秒杀Bat的笔试编程题?...

    很简单,打开 LintCode 随便找一道中等难度的题,如果能很快找到思路并提交代码通过,那么BAT公司的笔试编程题基本没什么问题了.(唯一需要注意的是国内公司笔试题目一般都很长,比较考验阅读理解能力 ...

  7. 网易笔试编程题java_2017年网易校招笔试JAVA研发编程题

    为什么80%的码农都做不了架构师?>>> 尝试挑战了下网易2017校招的笔试编程题,共三题,AC第一题,第二题思考了很久勉强用一种low逼的方式完成,第三题没有完成,希望路过的ACM ...

  8. 美团点评2017秋招笔试编程题

    美团点评2017秋招笔试编程题 1, 大富翁游戏,玩家根据骰子的点数决定走的步数,即骰子点数为1时可以走一步,点数为2时可以走两步,点数为n时可以走n步.求玩家走到第n步(n<=骰子最大点数且是 ...

  9. 2020哔哩哔哩校招后端开发笔试编程题总结

    2020哔哩哔哩校招后端开发笔试编程题总结 1.给定一个正整数N,试求有多少组连续正整数满足所有数字之和为N? (1 <= N <= 10 ^ 9) 暴力求解法: package Day4 ...

最新文章

  1. R语言使用basename函数获取数据链接地址中的文件名称(removes all of the path up to and including the last path separator )
  2. Android中service应用
  3. Django模板语言(译)
  4. MMSE法用于MIMO系统
  5. python里的resize_利用python之wxpy模块玩转微信!这部小儿科吗!
  6. hihoCoder #1872 : Pythagorean triple
  7. P4302-[SCOI2003]字符串折叠【区间dp】
  8. JDK 10:FutureTask获取一个toString()
  9. OpenCV参考手册之Mat类详解
  10. 2748: [HAOI2012]音量调节
  11. 第三方侧滑菜单SlidingMenu在android studio中的使用
  12. JAVA导入gpx文件_用于Java的GPX解析器?[关闭]
  13. svchost.exe进程内存占用过高案例解决方案一例
  14. 计算机基础知识进制的转换,计算机基础之各进制间的相互转换
  15. 新元宇宙奇科幻小说原创作品每周连载地球人奇游天球记第七回月球背面
  16. CDR插件开发之Addon插件007 - Addon插件简介和案例演示
  17. 英雄联盟无法开始第二局(已解决,亲测有效)
  18. (ACWing yxc算法基础课)习题课1.1
  19. DGUT新学期,新FLAG
  20. 震撼!世界从10亿光年到0.1飞米!

热门文章

  1. C++:构造函数的重载
  2. Hadoop发行版本选择
  3. 吴恩达 神经网络和深度学习 第一课 第一周(笔记,代码,数据集)
  4. phpcmsV9子栏目调用其父栏目名称、URL、catid等信息 - 方法总结
  5. 萝卜源码前后端源码 附打包APP的教程
  6. 【QR Code Generator】开源免费响应式QRcdr二维码生成网站源码
  7. 企业软件介绍主页html模板
  8. ASP.NET MVC实用技术:开篇
  9. EXEC和sp_executesql的区别
  10. 根据移动设备屏幕像素密度,给予不同分辨率的图片