题目描述
公司最近新研发了一种产品,共生产了n件。有m个客户想购买此产品,第i个客户出价Vi元。为了确保公平,公司决定要以一个固定的价格出售产品。每一个出价不低于要价的客户将会得到产品,余下的将会被拒绝购买。请你找出能让公司利润最大化的售价。
语言选择的是python3.6
- 第一次尝试:
# 思路:依次遍历p,计算列表中比p大的值的和,输出另和最大的p
l1= raw_input().split()
n, m =[int(i) for i in l1]
l2= raw_input().split()
clist=[int(i) for i in l2]
clist=clist[0:m]
def comp(a, p):
if a >= p:
return 1
else:
return 0
i = 0
biggest = 0
maxi = 0
p=0
while i < m:
p=clist[i]
if biggest <= sum([p*comp(j,p) for j in clist]):
maxi = i
biggest = sum([p*comp(j,p) for j in clist])
i = i + 1
print clist[maxi]
结果
问题:序列没必要遍历m次,可以对序列排个序
- 第二次尝试:
# 思路:降序排列列表,和为p*(m-i),输出和最大的p
l1= input().split()
n, m =[int(i) for i in l1]
l2= input().split()
clist=[int(i) for i in l2]
clist.sort(reverse=True)
i = n
prof = 0
p=0
q=0
while i > 0:
p=clist[i]
prof=p*(m-i)
if prof<clist[i+1]*(m-i-1) :
prof=clist[i+1]*(m-i-1)
q=clist[i+1]
elif prof == clist[i+1]*(m-i-1):
q = clist[i]
i = i - 1
print(q)
结果
问题:没有考虑到n比m小的情况,第一次也没考虑到
- 最终:
l1= raw_input().split()
n, m =[int(i) for i in l1]
l2= raw_input().split()
clist=[int(i) for i in l2]
n=min(n,m)
clist.sort(reverse=True)
prof = [(i+1)*clist[i] for i in range(0,n)]
idx=clist[prof.index(max(prof))]
print(idx)
结果
ps:望看到的朋友们给些意见,共同进步!刷题之路,道阻且长,出现这些问题的我可太菜了。。。。
网友评论