普通的写法会超时
2个for循环对于超级大的数据量时间复杂度很高
#include<iostream>
using namespace std;
int main()
{
int n,arr[300000],sum=0,x=0,cnt=0;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&arr[i]);
for(int i=1;i<=n;i++)
{
cnt=0;
for(int j=1;j<=n;j++)
{
if(j>i)
cnt+=arr[i]*arr[j];
}
sum+=cnt;
}
printf("%d\n",sum);
}
这里没有嵌套的for循环,原理是提取公因数,sum累加所有的和,依次乘sum再减去a[i]
#include<iostream>
using namespace std;
int main()
{
long long s=0;
int n;
cin>>n;
long int a[n],sum=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
sum+=a[i];
}
for(int i=0;i<n;i++)
{
sum-=a[i];
s+=sum*a[i];
}
cout<<s;
return 0;
}
时间复杂度大大降低,因为只有单层for循环