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

这两类糖果之所以广受儿童欢迎,是因为糖果中含有公司独家研发的魔幻因子。A1或A2序列中的糖果,看起来包装可能是一样的,但因为其中的魔幻因子含量不同被细分为不同的产品。

临近传统节日,公司的糖果供不应求。作为一个精明的糖果分销商,小东希望能够借此大赚一笔,于是带着现金开着货车来公司提货。货车的容量是确定的,小东希望采购的糖果能够尽可能装满货车,且糖果的魔幻因子总含量最高。只要不超出货车容量,糖果总可以装入货车中。

小东希望你能帮她解决这一问题。
输入
输入中有多组测试数据。每组测试数据的第一行有两个整数n和v,1<=n<=10^5, 1<=v<=10^9,n为可供选购糖果数量,v为货车的容量。随后n行为糖果的具体信息,第一行编号为1,第二行编号为2,以此类推,最后一行编号为n。每行包含两个整数ti和pi,1<=ti<=2, 1<=pi<=10^4,ti为糖果所属的序列,1为A1、2为A2,pi则是其中的魔幻因子含量。
输出
对每组测试数据,先在单独的一行中输出能采购的糖果中的魔幻因子最高含量,之后在单独的行中按编号从小到大的顺序输出以空格分隔的糖果编号,若有多组糖果组合均能满足要求,输出编号最小的组。若没有糖果能够满足要求,则在第一行中输出0,第二行输出“No”。

样例输入
3 2
1 2
2 7
1 3​
样例输出
7
2​

解题思路
通常是用0-1背包问题的解法来做,楼主自己想到了一种比较好的,复杂度为nlgn的方法,测试后发现算法运行时间为经典解法的一半。
具体思路:
分别获取不同空间的列表,并对其排序。先填充2空间的糖果,直到糖果用完或者空间快满,然后用1空间的糖果填充剩余空间。
之后,比较两个1空间的糖果和一个2空间的糖果魔法因子哪个更大,分别进行相应的替换。具体代码如下:(楼主 使用了Java代码,各位可以用其他代码进行尝试)

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;public class CandyProblem {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while(scanner.hasNextInt()){int nums = scanner.nextInt();int sumPlace = scanner.nextInt();int[][] singleNum = new int[nums][2];int[][] doubleNum = new int[nums][2];for (int i = 0; i < nums; i++) {int space=scanner.nextInt();if (space==1) singleNum[i]=new int[]{scanner.nextInt(),i+1};else doubleNum[i]=new int[]{scanner.nextInt(),i+1};}findNum(singleNum,doubleNum,sumPlace,nums);}}public static void findNum(int[][] singleNum, int[][] doubleNum, int sumPlace, int nums) {Arrays.sort(singleNum,new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {if (o1[0]<o2[0]) return 1;else if (o1[0]>o2[0]) return -1;else return 0;}});Arrays.sort(doubleNum,new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {if (o1[0]<o2[0]) return 1;else if (o1[0]>o2[0]) return -1;else return 0;}});if(sumPlace<1) System.out.println(0+"\n"+new ArrayList<>());else if(sumPlace==1) {List<Integer> list = new ArrayList<>();list.add(singleNum[0][1]);System.out.println(singleNum[0][0]+"\n"+list);}else {List<Integer> list = new ArrayList<>();int sum = 0;int doublenum = 0;for (int i = 0; i<nums && 2*doublenum<sumPlace-1; i++) {if (doubleNum[i][0]==0) break;list.add(doubleNum[i][1]);sum += doubleNum[i][0];doublenum++;}int singlenum = 0;//如果数组未满,则进行补全if (doublenum*2<sumPlace) {for (int i = 0; i <nums && doublenum*2+singlenum<sumPlace; i++) {list.add(singleNum[i][1]);sum += singleNum[i][0];singlenum++;}}//在数组满后,用临近的两个1容量的替换一个2容量的while(doublenum>0 && nums-singlenum-2>=0) {if (singleNum[singlenum][0]+singleNum[singlenum+1][0]>doubleNum[doublenum-1][0]) {list.remove((Object)doubleNum[doublenum-1][1]);sum -= doubleNum[doublenum-1][0];list.add(singleNum[singlenum][1]);sum += singleNum[singlenum][0];list.add(singleNum[singlenum+1][1]);sum += singleNum[singlenum+1][0];singlenum+=2;doublenum--;}else break;}System.out.println(list);System.out.println(sum);}}
}

转载请注明本网页,多谢。

编码-京东实习笔试编程题-糖果问题-动态规划相关推荐

  1. 编码-京东实习笔试编程题-生日礼物-动态规划

    题目: 生日礼物 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem De ...

  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. 农行2021计算机专业面试题,【面经】2021 中国农业银行 笔试编程题

    [面经]2021 中国农业银行 笔试编程题 2020年09月01日 | 萬仟网科技 | 我要评论 微信搜索:编程笔记本.获取更多干货!微信搜索:编程笔记本.获取更多干货!点击上方蓝字关注我,我们一起学 ...

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

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

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

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

  9. 经典笔试编程题--Java实现

    转载自  经典笔试编程题--Java实现 1.输入一个正数n,输出所有和为n的连续正数序列.  分析:设定两个指针,min指向和为n的连续正数序列的最小值,max指向和为n的连续正数序列最大值.sum ...

最新文章

  1. 【深度学习】2021 年了,TensorFlow 和 PyTorch 两个深度学习框架地位又有什么变化吗?...
  2. mybatis源码阅读(四):mapper(dao)实例化
  3. Oracle数据库管理员职责(二)
  4. mysql注册成功为啥启动不了mysql_mysql启动不成功的解决方法
  5. Web端口复用正向后门研究实现与防御
  6. 受控组件和非受控组件
  7. 玩转Excel系列-SUMIF函数实例教程
  8. 基于HTTP协议的轻量级开源简单消息队列服务:HTTPSQS
  9. c语言windows窗口程序,C语言编写windows窗口程序
  10. 液压系统管路流速推荐表_液压系统管道选择标准
  11. 成功解决IPython.core.display.HTML object
  12. 从faker.js 开源作者Marak已删除了GIthub所有代码我们得到了什么教训
  13. 使用easypoi导入导出excel,SSM和SpringBoot通用代码
  14. Python多进程写Kafka
  15. JAVA学习基础部分
  16. 54. Java序列化三连问,是什么?为什么需要?如何实现?
  17. Jsp程序设计-数据库练习题(二)
  18. 【计算机毕业设计】基于微信小程序的师生答疑平台的设计与实现
  19. Zeal - 离线 API 文档大全
  20. php mysql text换行符_请教php配合mysql的换行符和空格字符问题

热门文章

  1. KNIME二次开发的环境配置安装过程
  2. ospf避免环路_路由环路知识点总结!
  3. jupyter问题: failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED
  4. wordpress主题-响应式CUI2.0翠竹林博客主题wordpress模板分享
  5. 漂亮的页面过渡动画源码
  6. 蓝蛇端口扫描器 v2.8.4.724
  7. 百度SEO百度站长提交工具 v0.2
  8. java指定sql生成xml,用Java实现可保存状态的数据库生成XML树(8)-JSP教程,Java与XML...
  9. 频域串联滞后校正matlab,自动控制原理实验七基于MATLAB控制系统频域法串联校正设计.doc...
  10. Sakurairo开源WordPress主题模板