给定一个正数序列,定义一个连续的子序列为一段。例如给定序列{ 0.1, 0.2, 0.3, 0.4 }
,我们可以找到有10段:(0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1, 0.2, 0.3, 0.4) (0.2) (0.2, 0.3) (0.2, 0.3, 0.4) (0.3) (0.3, 0.4) 和 (0.4).
。
现在给定一个序列,你应该找到所有段中所有数字的总和。对于上一个实例,所有10个段的所有数字总和为:0.1 + 0.3 + 0.6 + 1.0 + 0.2 + 0.5 + 0.9 + 0.3 + 0.7 + 0.4 = 5.0
每个输入文件包含一个测试用例。对于每个用例,第一行给出一个正整数N,表示序列的大小,不超过105 。 下一行包含序列中的N个正数,每个数字不超过1.0,用空格分隔。
对于每个测试用例,在一行中打印所有段中所有数字的总和,精确到小数点后2位。
4
0.1 0.2 0.3 0.4
5.00
仔细观察不难发现,如果所有段按照子序列的首元素分类,可以分为N
类,而对于第i
(i从1
开始计数)个元素,只会出现在前i
类,且每次出现N-i+1
次。即每个元素出现的总和为value[i] * i * (N-i+1)
。
#include
#include
using namespace std;
double value[100005];
int main() {
int n;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> value[i];
}
double res = 0;
for(int i = 1; i <= n; i++) {
res += value[i] * i * (n-i+1);
}
printf("%.2lf\n", res);
return 0;
}