鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: jerryxjr1220

[技术交流] 鱼C论坛Python精英挑战赛(第四季01期)

[复制链接]
发表于 2017-11-28 21:12:12 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-28 22:55:50 | 显示全部楼层
def max_area(list_of_number):
    temp=list_of_number[:]
    temp.sort()
    maxlist=temp.pop()
    maxindex=list_of_number.index(maxlist)
    i=0
    maxarea=0
    j=len(list_of_number)-1
    while(maxindex-i):
        if (maxindex-i)*list_of_number[i]>maxarea:
            maxarea=(maxindex-i)*list_of_number[i]
        i+=1
    while(j-maxindex):
        if (j-maxindex)*list_of_number[j]>maxarea:
            maxarea=(j-maxindex)*list_of_number[j]
        j-=1
    return maxarea

点评

我很赞同!: 5.0
我很赞同!: 5
0.008s,5000列表长度,答案正确!非常棒,又一个可以跑100万列表长度的程序,用时0.475s  发表于 2017-11-30 09:06

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
jerryxjr1220 + 2 + 2 + 2 答题奖励,结果不正确

查看全部评分

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

使用道具 举报

发表于 2017-11-29 08:22:27 | 显示全部楼层
穷举法。。。
  1. def max_area(list_of_number):
  2.         r = 0
  3.         for i in range(len(list_of_number)-1):
  4.                 for j in range(i+1, len(list_of_number)):
  5.                         t = min(list_of_number[i], list_of_number[j]) * (j-i)
  6.                         if t > r:
  7.                                 r = t

  8.         return r

  9. print(max_area([1,8,6,2,5,4,8,3,7])) #calculte (len-1)^2/2
复制代码

点评

4.702s,5000列表长度,答案正确。  发表于 2017-11-29 08:48

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
jerryxjr1220 + 2 + 2 + 2 答题奖励,你应该能写得更好更快。

查看全部评分

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

使用道具 举报

发表于 2017-11-29 18:26:04 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-29 22:21:48 | 显示全部楼层
本帖最后由 gunjang 于 2017-11-29 22:38 编辑

@jerryxjr1220 好吧,稍微优化下,好像就没有超过0.01s的。。。
  1. import random,time

  2. def max_area0(list_of_number): #calculte (len-1)^2/2
  3.         r = 0
  4.         for i in range(len(list_of_number)-1):
  5.                 for j in range(i+1, len(list_of_number)):
  6.                         t = min(list_of_number[i], list_of_number[j]) * (j-i)
  7.                         if t > r: r = t

  8.         return r

  9. def max_area(list_of_number):
  10.         r = 0
  11.         for i in range(0, len(list_of_number)-1):
  12.                 minstep = r//list_of_number[i] + 1
  13.                 j  = len(list_of_number) - 1
  14.                 while j >= i+minstep:
  15.                         t = min(list_of_number[i], list_of_number[j]) * (j-i)
  16.                         if t > r:
  17.                                 r = t
  18.                                 minstep = r//list_of_number[i] + 1
  19.                         j -= 1
  20.         return r

  21. print(max_area([1,8,6,2,5,4,8,3,7]))  #49
  22. num5000 = [random.randint(1, 1000) for i in range(5000)]

  23. st = time.time()
  24. print('new maxarea:', max_area(num5000), time.time()-st)
  25. st = time.time()
  26. print('maxarea 0:', max_area0(num5000), time.time()-st)
复制代码

点评

我很赞同!: 5.0
100万列表长度,用时0.30s  发表于 2017-11-30 09:09
我很赞同!: 5
0.015s,5000列表长度,答案正确。非常棒,这是第2个可以跑100万列表长度的程序。  发表于 2017-11-30 08:47
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-1 06:28:29 | 显示全部楼层
shuo 发表于 2017-11-27 16:06
水平有限,实在想不出怎么优化,坐等题主答案呢。

注:这里回复的是评分者
那个不是三元操作符吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-12-1 07:18:31 From FishC Mobile | 显示全部楼层
timeislife 发表于 2017-12-1 06:28
注:这里回复的是评分者
那个不是三元操作符吗

三元操作符是x=a if b else c,他原来的写法是x=a if b是错的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-2 20:26:44 | 显示全部楼层
我投票猜中了吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-3 09:33:11 | 显示全部楼层
小白一名,说说我的思路:
无论求多少列之间的面积都可以

1/首先判断两个边界A、B,哪个最长,如果最长边在左边,就从左边开始计算,反之从右边。假设A>B,A在左边。
2/然后找AB之间剩余哪条边最长,假设为C,(重点来了),然后判断ABC长度大小,如果C<B<A,那么游戏结束,所有面积就是B的长度乘AB距离。这是一个循环,而且是整个循环的结束判断条件。
3/如果C>B,那么就会有C>A或者C<A,其实C与A的大小不影响后面的循环。第一块面积就是A与C之间的面积了。
4/然后循环就来了。C>B,C与B成了新的边界,那就把C当作A吧。于是乎就有了新的ABC,直到出现C<B<A,游戏结束,得到的所有面积加起来,就是原始边界AB之间的面积。

注:其实也不用分从左还是从右开始,就是3条边界的关系,为了表述方便,就说从左开始了。       说白了,就是求2条最长边之间的面积,然后求剩余部分2条最长边的面积,直到最后两条最长边,有一条是最原始的边界B。

表达的不是很清楚,意思大家明白就好了。
小白一枚,不会代码。代码怎么写,就靠诸位大神了。

哪位大神,指导一下这个思路是不是正确呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-12-3 11:49:13 From FishC Mobile | 显示全部楼层
HNXC 发表于 2017-12-3 09:33
小白一名,说说我的思路:
无论求多少列之间的面积都可以


思路是对的,代码的话优胜者们已经都提供了很优秀的代码了,可以作为参考。
自己动手写写代码才会提高水平哦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-3 13:56:29 | 显示全部楼层
jerryxjr1220 发表于 2017-12-3 11:49
思路是对的,代码的话优胜者们已经都提供了很优秀的代码了,可以作为参考。
自己动手写写代码才会提高水 ...

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

使用道具 举报

发表于 2018-4-6 11:23:21 | 显示全部楼层
  1. def max_area(_list):
  2.     rs=[]
  3.     for x in range(len(_list)):
  4.         for y in range(x,len(_list)-1):
  5.             rs.append(min(_list[x],_list[y+1])*(y-x+1))
  6.            
  7.     return max(rs)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-27 19:00:40 | 显示全部楼层
虽然看不懂,也看不懂答案 但
def max_area(a):
    a=[5,6,8,7,2,1,4,6,3,9]
    for i in range(len(a)):
        for j in range(len(a)-1):
            l = len(a[i],a[j])
            s = i*j*l
            print(s)
        
    '''your code here'''
    return result_of_max_area
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 08:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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