解题思路:

引用作者: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.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论