D


私信TA

用户名:ALS1111

访问量:22109

签 名:

等  级
排  名 55
经  验 11377
参赛次数 0
文章发表 132
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

TA的其他文章

python-摆花摆花
浏览:143

解题思路:

引用作者:https://blog.dotcpp.com/a/67057

观察题目,假如相邻的两个珠子,前面的珠子头坐标为m,尾坐标为r,后一个珠子头坐标为r,尾坐标为n。合并后保留了m和n,删除了r,之后r再也不能被使用,而m和n还可以在后续的合成中继续使用。

如果我们任意合并,在每次合并时都会删去一个r。如果我们删去的r是一个较大的值,那么意味着r被删除之后就再也不能参与到之后合并珠子时进行相乘的结果了。

要想得到最大的合并能量的结果,我们就要尽可能的保证较大的数能尽可能的参与到更多的珠子合并当中,而较小的数尽量较少的参与到珠子的合并当中。

那么解题方法就出现了。我们在每次合并时,我们都先删除掉数组中最小的r,直到合并到最后。这样就能得出最后的结果。


注意事项:

参考代码:

def f(n):  
    A = [int(i) for i in input().strip().split()]  
  
    ans = 0  
    for i in range(n-1):  #n颗珠子,需要合并n-1次
        min_index = A.index(min(A))  
  
        if min_index == len(A)-1:  
            ans = ans + A[min_index-1]*A[min_index]*A[0]  
        elif min_index == 0:  
            ans = ans + A[-1]*A[min_index]*A[min_index+1]  
        else:  
            ans = ans + A[min_index-1]*A[min_index]*A[min_index+1]  
  
        del(A[min_index])  
  
    print(ans)  
  
if __name__ == '__main__':  
    n = int(input())  
    f(n)


 

0.0分

1 人评分

  评论区

  • «
  • »