brucema 发表于 2017-11-28 21:12:12

{:5_93:}

brank 发表于 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>maxarea:
            maxarea=(maxindex-i)*list_of_number
      i+=1
    while(j-maxindex):
      if (j-maxindex)*list_of_number>maxarea:
            maxarea=(j-maxindex)*list_of_number
      j-=1
    return maxarea

gunjang 发表于 2017-11-29 08:22:27

穷举法。。。
def max_area(list_of_number):
        r = 0
        for i in range(len(list_of_number)-1):
                for j in range(i+1, len(list_of_number)):
                        t = min(list_of_number, list_of_number) * (j-i)
                        if t > r:
                                r = t

        return r

print(max_area()) #calculte (len-1)^2/2

python_chan 发表于 2017-11-29 18:26:04

{:10_279:}{:10_279:}{:10_279:}

gunjang 发表于 2017-11-29 22:21:48

本帖最后由 gunjang 于 2017-11-29 22:38 编辑

@jerryxjr1220 好吧,稍微优化下,好像就没有超过0.01s的。。。{:5_91:}
import random,time

def max_area0(list_of_number): #calculte (len-1)^2/2
        r = 0
        for i in range(len(list_of_number)-1):
                for j in range(i+1, len(list_of_number)):
                        t = min(list_of_number, list_of_number) * (j-i)
                        if t > r: r = t

        return r

def max_area(list_of_number):
        r = 0
        for i in range(0, len(list_of_number)-1):
                minstep = r//list_of_number + 1
                j= len(list_of_number) - 1
                while j >= i+minstep:
                        t = min(list_of_number, list_of_number) * (j-i)
                        if t > r:
                                r = t
                                minstep = r//list_of_number + 1
                        j -= 1
        return r

print(max_area())#49
num5000 =

st = time.time()
print('new maxarea:', max_area(num5000), time.time()-st)
st = time.time()
print('maxarea 0:', max_area0(num5000), time.time()-st)

timeislife 发表于 2017-12-1 06:28:29

shuo 发表于 2017-11-27 16:06
水平有限,实在想不出怎么优化,坐等题主答案呢。

注:这里回复的是评分者
那个不是三元操作符吗

jerryxjr1220 发表于 2017-12-1 07:18:31

timeislife 发表于 2017-12-1 06:28
注:这里回复的是评分者
那个不是三元操作符吗

三元操作符是x=a if b else c,他原来的写法是x=a if b是错的

timeislife 发表于 2017-12-2 20:26:44

我投票猜中了吗?

HNXC 发表于 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。

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

哪位大神,指导一下这个思路是不是正确呢?

jerryxjr1220 发表于 2017-12-3 11:49:13

HNXC 发表于 2017-12-3 09:33
小白一名,说说我的思路:
无论求多少列之间的面积都可以



思路是对的,代码的话优胜者们已经都提供了很优秀的代码了,可以作为参考。
自己动手写写代码才会提高水平哦!

HNXC 发表于 2017-12-3 13:56:29

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

嗯,好的。

Lucas.liang 发表于 2018-4-6 11:23:21

def max_area(_list):
    rs=[]
    for x in range(len(_list)):
      for y in range(x,len(_list)-1):
            rs.append(min(_list,_list)*(y-x+1))
         
    return max(rs)

紫癜聪 发表于 2020-12-27 19:00:40

虽然看不懂,也看不懂答案 但
def max_area(a):
    a=
    for i in range(len(a)):
      for j in range(len(a)-1):
            l = len(a,a)
            s = i*j*l
            print(s)
      
    '''your code here'''
    return result_of_max_area
页: 1 [2]
查看完整版本: 鱼C论坛Python精英挑战赛(第四季01期)