题目链接:
https://pintia.cn/problem-sets/994805342720868352/problems/994805363914686464
思路:
1.我们用序号[0…n-1]来给这n个数标号,观察可以发现包含第i个数的连续段起点只能在0 ~ i,终点只能在i ~ n-1;因此包含序号i的数的连续段一共有(i+1)*(n-i)个;
2.如果用double存储、累加求和结果,会因为double的内存存储精度问题而产生失精的结果;解决方法是将数据放大一定的倍数从而改用long long类型存储;
3.经过尝试如果方法过大的倍数也会出错,博主先前放大了1e6倍,导致测试点02错误,改为放大1000倍后通过;
代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
#ifdef MyTest
freopen("Sakura.txt", "r", stdin);
#endif
long long n, ans = 0;
scanf("%lld", &n);
for(long long i = 0; i < n; ++i) {
double x;
scanf("%lf", &x);
ans += (n - i) * (i + 1) * (long long)(x * 1000ll);
}
printf("%.2f", ans / 1000.0);
return 0;
}