求和-蓝桥

题目链接:1.求和 - 蓝桥云课 (lanqiao.cn)

解题思路:很多人肯定第一想法直接暴力遍历两个for循环,数据范围200000,肯定会超时,所以用前缀和来做,首先赋值整个数组,然后倒着遍历数组,arr[n - 2] = arr[n - 2] + arr[n - 1].....

arr[2] = arr[2] + arr[3],除开第一项和最后一项,每一项等于原数组当前索引元素的值加上后面所有元素的值,最后用原数组依次乘前缀和数组的和就是答案,复杂度为O(n)。

下面是c++代码:

#include 
using namespace std;
int main()
{
  long long n,arr[200000],num = 0,brr[200000];
  cin >> n;
  for(int i = 0;i < n;i++){
    cin >> arr[i];
    brr[i] = arr[i];
  }
  for(int i = n - 2;i >= 1;i--){
    arr[i] = arr[i] + arr[i + 1];
  }
  for(int i = 0;i < n - 1;i++){
    num += brr[i] * arr[i + 1];
  }
  cout << num;
  return 0;
}

你可能感兴趣的:(算法)