鱼C论坛

 找回密码
 立即注册
查看: 5379|回复: 57

[技术交流] Python:每日一题 180

[复制链接]
发表于 2018-6-4 10:37:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬雪雪冬 于 2018-6-10 16:12 编辑

我们的玩法做了一下改变:

1. 楼主不再提供答案。
2. 请大家先独立思考,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。开始阶段是看不到其他人的回帖的,等答题完成,开始评分时再取消限制。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
给你n个正整数(n为偶数),将这些数两两组合并将值相加,再将各个加的结果相乘,某种组合可以得到最终结果的值最大,求出最大值是多少。
例如给你的数字是28, 12, 89, 15, 28, 4, 36, 55,可以有不同的组合,如(28 + 12) * ( 89 + 15) * (28 + 4) * (36 + 55),(12 + 4) * (89 + 15) * (28 + 28) * (55 + 36)等等,其中必有一种可能得到结果是最大的(17795736)。

游客,如果您要查看本帖隐藏内容请回复

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-6-4 12:33:37 | 显示全部楼层
本帖最后由 8306最硬 于 2018-6-4 12:43 编辑

沙发!!
  1. def fun(x):
  2.     x = sorted(x)
  3.     return sum(x) if len(x) == 2 else (x[0] + x[-1]) * fun(x[1:-1])
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-4 13:26:15 | 显示全部楼层
  1. def calMax(iterable):
  2.         if iterable == None:
  3.                 return
  4.         for each in iterable:
  5.                 assert each > 0 ,'必须都是正数!'
  6.                 assert  isinstance(each,int) ,'必须都是整数!'
  7.         lenth = len(iterable)
  8.         assert lenth % 2 == 0 ,'必须是偶数个数字!'
  9.         list_temp = list(iterable)                        
  10.         list_temp.sort()
  11.         result = 1
  12.         for i in range(int(lenth/2)):
  13.                 result *= (list_temp[i]+list_temp[-(i+1)])
  14.         return result


  15. list1 = [28, 12, 89, 15, 28, 4, 36, 55]

  16. print(calMax(list1))
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-4 16:44:05 | 显示全部楼层
本帖最后由 冰封雪舞 于 2018-6-10 20:59 编辑

x=[28,12,89,15,28,4,36,55]
k=0
a1=0
b1=0
c1=0
d1,e1,f1,g1,h1,=0,0,0,0,0
for a in range(0,8):        
        for b in range(0,8) :
            if b==a:
                continue
            for c in range(0,8) :
                if b==c or c==a:
                    continue
                for d in range(0,8) :
                    if d==a or d==b or d ==c:
                        continue
                    for e in range(0,8):
                        if e==a or e==b or e==c or e==d:
                            continue
                        for f in range(0,8):
                            if f ==a or f==b or f==c or f==d or f==e:
                                continue
                            for g in range(0,8):
                                if g ==a or g==b or g==c or g==d or g==e or g==f:
                                    continue
                                for h in range(0,8):
                                    if h ==a or h==b or h==c or h==d or h==e or h==f or h==g:
                                        continue
                                    j=(x[a]+x)*(x[c]+x[d])*(x[e]+x[f])*(x[g]+x[h])
                                    if j>k:
                                        k=j
                                        a1,b1,c1,d1,e1,f1,g1,h1=x[a],x,x[c],x[d],x[e],x[f],x[g],x[h]
                                                                                       
print('值最大的组合是(%d+%d)*(%d+%d)*(%d+%d)*(%d+%d)=%d'%(a1,b1,c1,d1,e1,f1,g1,h1,k))

程序太长,估计粘贴的少了点东西

点评

报错:TypeError: unsupported operand type(s) for +: 'int' and 'list'  发表于 2018-6-10 16:16
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-4 17:21:40 | 显示全部楼层
#未考虑效率问题,先撸出来
from itertools import permutations
numbers=[28,12,89,15,28,4,36,55]
maxnum=[0,0,0,0,0,0,0,0]
mymax=0
if len(numbers)%2!=0:
    print ("数字个数不是偶数,无法两两相加!")
else:
    for i in permutations(numbers,len(numbers)):
        if (i[0]+i[1])*(i[2]+i[3])*(i[4]+i[5])*(i[6]+i[7])>mymax:
            mymax=(i[0]+i[1])*(i[2]+i[3])*(i[4]+i[5])*(i[6]+i[7])
            for k in range(0,len(numbers)):
                maxnum[k]=i[k]
                        
print (maxnum)
print (mymax)

运行结果:

[28, 28, 12, 55, 89, 4, 15, 36]
17795736

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-4 17:43:36 | 显示全部楼层
  1. lis = [28, 12, 89, 15, 28, 4, 36, 55]
  2. lis.sort()
  3. for i in range(len(lis)//2):
  4.         print('(',lis[i],'+',lis[0-(i+1)],')', end ='*')
复制代码

最后一个*我赖的处理了。

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-4 17:56:31 | 显示全部楼层
本帖最后由 凌九霄 于 2018-6-6 08:38 编辑
  1. import functools
  2. import operator

  3. # 解题的要点应该是各个数的大小差要尽可能的小,这样它们的积才能最大,明白这一点题目就简单了,排序后,
  4. # 用最大值加最小值,次大值加次小值....以此类推,所得和相乘即可

  5. def maximum(lst):
  6.     tmp = sorted(lst)
  7.     length = len(tmp)
  8.     Tlst = list(zip(tmp[:int(length / 2)], tmp[int(length / 2):][::-1]))
  9.     if length % 2 != 0:
  10.         Tlst.append((tmp[::-1][int(length / 2) + 1], 0))

  11.     return functools.reduce(operator.mul, list(map(sum, Tlst)), 1)
复制代码

评分

参与人数 1荣誉 +5 鱼币 +4 收起 理由
冬雪雪冬 + 5 + 4

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-4 18:49:10 | 显示全部楼层
  1. def f(x):
  2.     x=sorted(x)
  3.     N=len(x)//2
  4.     result=1
  5.     for i in range(N):
  6.         result*=(x[i]+x[2*N-i-1])
  7.         print('(%d+%d)'%(x[i],x[2*N-i-1]),end='')
  8.         if i<N-1:
  9.             print(end='*')
  10.         else:
  11.             print('=',result)

  12. f((28, 12, 89, 15, 28, 4, 36, 55))
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-4 22:35:36 From FishC Mobile | 显示全部楼层
本帖最后由 z1446773686 于 2018-6-5 14:34 编辑

import random
list1=[25,12,89,15,50,9]
num=6;list2=[]
count=0
while(count<1000):
    cent=0
    list3=[]
    list4=[]
    for eacht in range(num/2):
        nub1=0;nub2=0
        nub1,nub2=random.sample(list1,2)
        list3.append(nub1)
        list3.append(nub2)
    for each in list3:
        if list3.count(each)>1:
            cent = 1
            break
    if cent:
        continue
    print(list3)         
    for each in range(len(list3)-1):
        list4.append(list3[each]+list3[each+1])
    tit2=1
    for eacht in list4:
        tit2*=eacht
    if tit2 not in list2:
        list2.append(tit2)
        count-=1
    print(len(list2))
    print(max(list2))
    #print(list2.count(tit2))
    print('*')
    count+=1
建立在元素成员无一重复和中途添加的基础上
Screenshot_2018-06-05-09-17-40-71.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-5 10:12:52 | 显示全部楼层
x = [28, 12, 89, 15, 28, 4, 36, 55]
num = len(x)//2
x.sort()
for i in range(num):
    y1 =int(x[i])
    y2 =int(x[len(x)-1-i])
    s = y1+y2
    T = T * s
print(T)

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-5 10:36:00 | 显示全部楼层
  1. def maxmult(a):
  2.         s,res=sorted(a),1       
  3.         for i in range(len(s)//2):       
  4.                 res*=s[i]+s[len(s)-i-1]
  5.         return res

  6. a=[28, 12, 89, 15, 28, 4, 36, 55]
  7. print(maxmult(a))
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-5 10:42:58 From FishC Mobile | 显示全部楼层
python
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-5 13:36:53 | 显示全部楼层
import itertools
def test_func1(num_list):
    tmp_list = itertools.permutations(num_list)
    res_list=[]
    for one in  tmp_list:
        res_list.append(one)
    return res_list
list1 = [28, 12, 89, 15, 28, 4, 36, 55]
newList = test_func1(list1)
num = len(newList)//len(list1)
list2 = newList[:num]
sumlist = []
mullist = []

for ele in list2:
    for i in range(len(list1)):
        if(i%2==0):
            sumlist.append(ele[i]+ele[i+1])
    multi = 1
    for j in sumlist:
        multi = multi * j
    mullist.append(multi)
    sumlist = []
    multi = 1
print('最大值为:',max(mullist))

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-5 15:00:40 | 显示全部楼层
  1. ll = [28, 12, 89, 15, 28, 4, 36, 55]
  2. jj = sorted(ll)

  3. ss = []
  4. u = 1

  5. for i in range(len(ll)//2):
  6.     ss.append(jj[i]+jj[len(ll)-1-i])

  7. for i in range(len(ss)):
  8.     u *= ss[i]

  9. print('最大的结果是:'+str(u))
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-6 10:47:08 | 显示全部楼层
本帖最后由 776667 于 2018-6-11 09:50 编辑
  1. from itertools import permutations

  2. def fun180(*x):
  3.     result_list = []
  4.     for i in permutations(x):
  5.         i = list(i)
  6.         sum_list = []
  7.         for j in range(len(i))[::2]:
  8.             sum_list.append(str(i[j]+i[j+1]))
  9.         result_list.append(eval('*'.join(sum_list)))
  10.     return max(result_list)
复制代码


我这个不用输入列表,直接敲数字进去就行了,因为题目是要求输入数字而不是输入列表,所以我这么写,报错是输入列表作为参数了
  1. >>> fun180(28,12,89,15,28,4,36,55)
  2. 17795736
复制代码

点评

报错:IndexError: list index out of range  发表于 2018-6-10 16:24
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-6 15:03:26 | 显示全部楼层
  1. a = sorted([28,12,89,15,28,4,36,55])

  2. b = []
  3. for i in range(int(len(a)*0.5)):
  4.     b.append(a[i]+a[-(i+1)])
  5.    
  6. result = 1
  7. for x in b:
  8.     result *= x

  9. print(result)
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-6 19:00:37 | 显示全部楼层
做不来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-6 21:49:01 | 显示全部楼层
number=[28,12,89,15,28,4,36,55]
i = 0
n = 7
sume = [0,0,0,0]

while i < 7:
    j = 0
    while j + 1 <= 7 :
        if number[j] > number[j+1]:
            ex = number[j]
            number[j] = number[j+1]
            number[j+1] = ex
        j = j + 1
    i = i + 1
i = 0
n = 7
while i < 4:
    sume[i] = number[i] + number[n-i]
    i += 1
mul = 1
i = 0
while i < 4:
    mul = mul * sume [i]
    i = i + 1
   
print(number)
print(sume)
print(mul)

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-6 21:49:46 | 显示全部楼层
[4, 12, 15, 28, 28, 36, 55, 89]
[93, 67, 51, 56]
17795736
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-6 22:01:04 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 20:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表