这道题我们很容易得知如果用int很容易爆掉,因此我们可以开一个longlong类型防止爆掉,而暴力做法也很简单,跟着题目的描述开两层for循环即可解决
上代码:
//暴力做法
#include<iostream>
#include<cstring>
#include<algorithm>
#define int long long//开longlong类型防止爆掉
using namespace std;
const int N = 2e5 + 10;
int a[N];
int n;
int sum = 0;
signed main(void)
{
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i < n; i++) {
for (int j = i + 1; j <= n; j++) {
sum += a[i] * a[j];
}
}
cout << sum << endl;
return 0;
}
这段代码最后也没能通过全部样例
接下来就是优化方法,我们从中很容易看出,将a[1],a[2]......分别提出来,就可以得到括号中是其他项的和,对于每个项的和,我们可以用数组fun来存储,这样只需要两个一层for循环,从而减少了计算次数
上代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#define int long long//开longlong类型防止爆掉
using namespace std;
const int N = 2e5 + 10;
int a[N];
int n;
int sum = 0;
int fun[N] = { 0 };
signed main(void)
{
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
fun[i] = fun[i - 1] + a[i];
}
for (int i = 1; i <= n; i++) {
sum += a[i] * (fun[n] - fun[i]);
}
cout << sum << endl;
return 0;
}