AC代码
#include<stdio.h>
int main()
{
long N=0;
scanf("%ld",&N);
long double a[N],sum=0.0;
for(int i=0;i<N;i++)
{
scanf("%llf",&a[i]);
sum=sum+a[i]*(i+1)*(N-i);
}
printf("%.2llf\n",sum);
return 0;
}
核心语句总结
这道题的核心在于 sum=sum+a[i](i+1)(N-i);的数学公式总结。
使用暴力累加的方式会导致O(n^2)的复杂度,导致运行超时。
可以采取举例子的方式来总结方式,比如对于
4
0.1 0.2 0.3 0.4
0.1分别与0.2、0.3、0.4相加,加了3次,一共加了一轮
0.2分别与0.3、0.4相加,一共加了2次,算上0.1里边的,一共加了两轮
i+1代表加了几轮,N-i代表加了几次
别踩坑
首先是C里边int最大值是32767,10^5这个数量级肯定得用long int
其次,测试点3没通过的原因在于,当N足够大的时候,(N-i)*(i+1)是10^10级,再加上累加,用double存会损失精度。
用long double存则不会。