代码
#include <iostream>
using namespace std;
int main() {
int n;
scanf("%d", &n);
double num[n];
for(int i=0; i<n; i++){
scanf("%lf", &num[i]);
}
double w[n];
for(int i=0; i<n; i++){
w[i] = (double)(i+1) * (n-i);
}
double ans = 0;
for(int i=0; i<n; i++){
ans += num[i]*w[i];
}
printf("%.2lf\n", ans);
return 0;
}
注解
1、关键是这句:w[i] = (double)(i+1) * (n-i);
必须要先转换成double类型,否则会因为(i+1) * (n-i)太大,超过了int类型而溢出!就会有案例是Wrong Answer。
2、找规律同样很重要,此题能找出来(i+1) * (n-i)这个式子是解题的关键。
例如长度是4,次数就分别是14, 23, 32, 41。这样类似的规律,第一个数字每次递增1,第二个数字每次递减1,二者相乘就是最终的答案。
关于这个式子如何推出来的?建议多试一试,拿n=2,n=3,n=4,n=5手动试一下就有感觉了。