求和。。.。

题目名字

求和

题意

给定 n 个整数 a1, a2, · · · , an ,求它们两两相乘再相加的和,即 S = a1 · a2 + a1 · a3 + · · · + a1 · an + a2 · a3 + · · · + an-2 · an-1 + an-2 · an + an-1 · an.

思路

  1. 定义变量:long long a, b, n, i, k = 0, sum = 0; 定义了6个变量,其中 a 是数组,b 是用来暂存输入的数字,n 是用来存储输入数字的个数,i 是循环计数器,``sum` 是用来存储累加的和。

  2. 读取输入数字的个数:cin >> n; 通过 cin 从标准输入读取一个数字并存储到变量 n 中,表示后面将要输入的数字个数。

  3. 循环读取数字并计算加权和:for (i = 0; i < n; i++) 表示一个循环,循环次数为输入的数字个数 n。然后执行 k += sum * b;sum += b; 分别表示将当前数字 b 乘以累加和 sum 的结果累加到 k 中,然后将当前数字 b 累加到 sum 中。

坑点

  1. 数据范围:对于所有评测用例,1 ≤ n ≤ 200000,1 ≤ ai ≤ 1000。需要使用合适的long long int进行运算

2.循环边界:内层循环的起始位置应该是外层循环的下一个数,即从i+1开始,否则会重复计算。

算法一:

实现步骤

这段代码实现的步骤如下:

  1. 定义变量:定义了6个变量 long long a, b, n, i, k = 0, sum = 0;,分别用来存储输入数字的个数 n,当前输入的数字 b,循环计数器 i,最终的加权和 k,以及累加的和 sum

  2. 读取输入数字的个数

  3. 循环读取数字并计算加权和:通过 for 循环,循环次数为输入的数字个数 n。在循环体内部,首先通过 cin >> b; 读取一个数字并存储到变量 b 中,然后执行 k += sum * b;sum += b; 这两行代码,分别表示将当前数字 b 乘以累加和 sum 的结果累加到 k 中,然后将当前数字 b 累加到 sum 中。

代码
#include 
using namespace std;
long long int a[200005];
long long int s[200005];
long long int sum=0;
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        s[i]=s[i-1]+a[i];//前缀和 
    }
    for(int i=1;i<=n;i++)
    {
        sum+=a[i]*(s[n]-s[i]);//前一项减去后一项 
    }
    printf("%lld\n",sum);
    return 0;
}

}

总结

  1. 首先这道题我用了两重for循环进行,第一重表示次数,第二重表示第二个数一直逐步加一。但是第二个点一直超时,还有就是边界,n和sum当时我没看清数据大小,所以一直用的是int,应该用longlong,相对应的应该是lld。之后一定要看数据大小,一定要开大。sum也要先定义为0。
    2.for循环尽量少用,会超时
    3.别的我又做不出来,所以这道题一直空着,后面也没全看完。下次一定先把题目看完,再挑出会写的题目做,不能只盯着一个题目不放
    4.这个方法用的是前缀和的思路,但是我没看出来,而且公式也没有记全,不能因为讲过二位前缀和就忘记以为前缀和

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