2017京东实习生招聘编程题——买糖果(python)

题目描述
	
# 

某糖果公司专门生产儿童糖果,它最受儿童欢迎的糖果有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


# -*- coding: utf-8 -*-
import sys
while 1:
    basic_input=raw_input()
    if basic_input!="":
        candy_count=int(basic_input.split(' ')[0])
        car_capacity=int(basic_input.split(' ')[1])
        candy_capacity_dict={}
        candy_factor_count_dict={}
        candy1,candy2=[],[]
        for i in range(1,candy_count+1):
            candy_input=raw_input()
            candy=candy_input.split(' ')
            if int(candy[0])==1:
                candy1.append(i)
            else:
                candy2.append(i)
            candy_capacity_dict[i]=int(candy[0])
            candy_factor_count_dict[i]=int(candy[1])
        left_car_capacity=car_capacity
        factor_sum=0
        min_left_candy_capacity=min(candy_capacity_dict.values())
        left_candy=range(1,candy_count+1)
        left_candy1=candy1
        left_candy2=candy2
        pict_candy=[]
        if min_left_candy_capacity>left_car_capacity:
            sys.stdout.write('0'+'\n')
            sys.stdout.write('No'+'\n')
        else:
            while left_car_capacity>=min_left_candy_capacity:
                ava_candy,ava_candy1,ava_candy2=[],[],[]
                for i in left_candy:
                    if candy_capacity_dict[i]<=left_car_capacity:
                        ava_candy.append(i) 
                for i in ava_candy:
                    if i in candy1:
                        ava_candy1.append(i)
                    else:
                        ava_candy2.append(i)
                print ava_candy1,ava_candy2      
                ava_candy1_factor_dict=dict([(key, candy_factor_count_dict[key]) for key in ava_candy1])
                print 'ava_candy1_factor_dict',ava_candy1_factor_dict
                pict_candy1_detail= sorted(ava_candy1_factor_dict.items(), key=lambda d:d[1], reverse = True)[0:2]
                print 'pict_candy1_detail',pict_candy1_detail
                pict_candy1=[x[0] for x in pict_candy1_detail]
                pict_candy1_factor=sum([x[1] for x in pict_candy1_detail])
                ava_candy2_factor_dict=dict([(key, candy_factor_count_dict[key]) for key in ava_candy2])
                pict_candy2_detail= sorted(ava_candy2_factor_dict.items(), key=lambda d:d[1], reverse = True)[0]
                pict_candy2=pict_candy2_detail[0]
                pict_candy2_factor=pict_candy2_detail[1]
                if pict_candy1_factor>pict_candy2_factor:
                    pict_candy=pict_candy+pict_candy1
                    factor_sum=factor_sum+pict_candy1_factor
                    left_car_capacity=left_car_capacity-len(pict_candy1)
                    left_candy=[i for i in left_candy if i not in pict_candy1]
                    print 'a',pict_candy,'b',factor_sum,'c',left_car_capacity,'d',left_candy
                elif pict_candy1_factor==pict_candy2_factor:
                    if min(pict_candy1)<pict_candy2:
                        pict_candy=pict_candy+pict_candy1
                        factor_sum=factor_sum+pict_candy1_factor
                        left_car_capacity=left_car_capacity-len(pict_candy1)
                        left_candy=[i for i in left_candy if i not in pict_candy1]
                        print 'a',pict_candy,'b',factor_sum,'c',left_car_capacity,'d',left_candy
                    else:
                        pict_candy.append(pict_candy2)
                        factor_sum=factor_sum+pict_candy2_factor
                        left_car_capacity=left_car_capacity-2
                        left_candy.remove(pict_candy2)
                        print 'a',pict_candy,'b',factor_sum,'c',left_car_capacity,'d',left_candy
                else:
                    pict_candy.append(pict_candy2)
                    factor_sum=factor_sum+pict_candy2_factor
                    left_car_capacity=left_car_capacity-2
                    left_candy.remove(pict_candy2)
                    print 'a',pict_candy,'b',factor_sum,'c',left_car_capacity,'d',left_candy
                left_candy1=[i for i in left_candy if i in candy1]
                left_candy2=[i for i in left_candy if i in candy2]
                if len(left_candy1)!=0:
                    min_left_candy_capacity=1
                elif len(left_candy1)==0 and len(left_candy2)!=0:
                    min_left_candy_capacity=2
                else:
                    min_left_candy_capacity=0
                print 'min_left_candy_capacity=',min_left_candy_capacity
            print factor_sum
            pict_candy.sort()
            for i in pict_candy[:-1]:
                sys.stdout.write(str(i)+' ')
            sys.stdout.write(str(pict_candy[-1])+'\n')
    else:
        break


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值