题目解析:
普通做法是每次列出求出相邻两数字的最小和,然后将最小和替换掉a[i],同时将a[i]后边的数字向前移动,
当然这样肯定会超时,时间复杂度为O(n^2)必然tle,呜呜呜
做这种题目应该学会推理,推理发现其实最后胶水的结果与两个数字先后乘积并没有关系,推一下规律立马就出来了!!!
本题目结合规律非常简单,而我确空想办法好长时间,这种题目找规律!!!!
这样一个前缀和就ok了
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e5+10;
typedef long long ll;
int a[N],n;
ll s[N];
ll res;
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],s[i]=s[i-1]+(ll)a[i];
for(int i=2;i<=n;i++) res+=(s[i-1]*(ll)a[i]);
cout<<res;
return 0;
}