买糖果(京东2016实习生真题)
来源:互联网 发布:淘宝聊天记录 编辑:程序博客网 时间:2024/05/17 16:13
题目描述某糖果公司专门生产儿童糖果,它最受儿童欢迎的糖果有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则是其中的魔幻因子含量。
样例输入
3 2
1 2
2 7
1 3
输出
对每组测试数据,先在单独的一行中输出能采购的糖果中的魔幻因子最高含量,之后在单独的行中按编号从小到大的顺序输出以空格分隔的糖果编号,若有多组糖果组合均能满足要求,输出编号最小的组。若没有糖果能够满足要求,则在第一行中输出0,第二行输出“No”。
样例输出
7
2
时间限制C/C++语言:1000MS其它语言:3000MS
内存限制C/C++语言:65536KB其它语言:589824KB
///////*//////要求:1.背包中的val最大////// 2.需要知道背包中放了哪些东西 //////*/#include<stdio.h>#include<algorithm>#include<queue> using namespace std;struct stu{int n,p;};bool operator < (stu a,stu b){ if(a.p==b.p){ return a.n>b.n;//按n的大小,从小到大输出队 } return a.p<b.p;}int main(){int n,v,i,t,sum,k,v1,v2,xn,xp,flag;int c[10010];stu ca,c1,c2,c3;priority_queue<stu>q1;priority_queue<stu>q2;while(scanf("%d%d",&n,&v)!=EOF){while(!q1.empty()) q1.pop(); while(!q2.empty()) q2.pop(); flag=0;k=0;sum=0; xp=10010;for(i=1;i<=n;i++){//保存糖果信息 scanf("%d%d",&t,&ca.p); ca.n=i;if(t==1){q1.push(ca); }else{ q2.push(ca); }}while((q1.size()>0||q2.size()>0)&&v){//开始装糖果 ,q1,q2其中两个同时不能为空 if(q1.size()>=2){//q1能出两份糖果 c1 = q1.top(); q1.pop(); c2=q1.top(); q1.pop(); v1=2; }else if(q1.size()==1){//q1只能出一份糖果 c1 = q1.top(); q1.pop(); v1=1; }else{//q1没有糖果了 v1=0; }if(!q2.empty()){//q2能出糖果 c3=q2.top(); q2.pop();}else{c3.n=0;c3.p=0;}if(v>=2){ if(v1==2){//q1能出两份糖果 if(c3.p>=c2.p+c1.p){//如果c3没有糖果就为0; c[k++]=c3.n; sum+=c3.p; q1.push(c1); q1.push(c2);}else{c[k++]=c1.n;c[k++]=c2.n;if(c2.p<xp){xp=c2.p;xn=c2.n;}sum+=c1.p+c2.p; if(c3.n!=0){ q2.push(c3);//此时q2为空却又存进去,会发生错误,所以需要判断 }}v-=2; }else if(v1==1){//q1只能出一份糖果 if(c3.p>=c1.p){ c[k++]=c3.n; sum+=c3.p; q1.push(c1); //if(c1.n==0){ //printf("3\n"); //} v-=2; }else{ c[k++]=c1.n; sum+=c1.p; v-=1; if(c1.p<xp){ xp=c1.p; xn=c1.n; } if(c3.n!=0){ q2.push(c3);//此时q2为空却又存进去,会发生错误,所以需要判断 } //if(c1.n==0){ //printf("4\n"); // } } }else{//q1没有糖果了 ,又能保证q2可定有糖果 c[k++]=c3.n; sum+=c3.p; v-=2; } }else{ //v==1 if(v1&&(c1.p>c3.p||c1.p+xp>c3.p)){ c[k++]=c1.n; sum+=c1.p; // if(c1.n==0){ //printf("6\n"); //} }else if(c3.p>xp){ c[k++]=c3.n; sum+=c3.p; sum-=xp; flag=1; //if(c3.n==0){ //printf("5\n"); // } } break; } }if(sum==0){printf("0\nNo\n");}else{printf("%d\n",sum);sort(c,c+k);int s=0; for(i=0;i<k;i++){ if(flag&&c[i]==xn) continue; if(s==0){//未输出第一个 printf("%d",c[i]); s=1; } else{ printf(" %d",c[i]); } } printf("\n"); } }return 0;}
0 0
- 买糖果(京东2016实习生真题)
- [编程题]京东2016-买糖果
- 京东2016实习生招聘c++开发工程师在线考试-买糖果
- 2017京东实习生招聘编程题——买糖果(python)
- 三子棋(京东2016实习生真题)
- 生日礼物(京东2016实习生真题)
- 备考(京东2016实习生真题)
- 交易清单(京东2016实习生真题)
- 选举游戏(京东2016实习生真题)
- 路径规划(京东2016实习生真题)
- 选举游戏(京东2016实习生真题)
- 交易清单(京东2016实习生真题)
- 站队(京东2017实习生真题)
- 【算法题】买糖果
- 终结者编程题(京东2017实习生真题)
- 站队编程题(京东2017实习生真题)
- 通过考试(京东2017实习生真题)
- 通过考试(京东2017实习生真题)
- 用邻接链表存储无向图和有向图
- win10创意者更新是什么 Win10创意者更新升级方法
- Linux Ubuntu从零开始部署web环境及项目 -----tomcat+jdk+mysql (二)
- redirect和forward的区别
- 定时5秒自动换图和背景加onclick点击左右切换图片和背景
- 买糖果(京东2016实习生真题)
- platform按键驱动学习
- SSM框架——以注解形式实现事务管理
- Unbuntu16.04.1如何启动、关闭hadoop
- YAML 语言格式
- rails 安装bootstrap
- 安卓基础回调~以及关于部分直播录制压缩问题
- poi 操作excel的样式
- struts2文件上传设置上传文件类型