思路: 求各个数列的片段的和 相当于 求出 每个 数出现的次数 然后全部相加 即可 。
这里 如果 用双重循环 遍历 肯定炸 超时一定的。
这里 类似与 数学的找规律 :可以发现 每个数出现的次数 是有一定规律的,
如下 :
如{0.1, 0.2, 0.3, 0.4,0.5}
(0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1, 0.2, 0.3, 0.4) (0.1, 0.2, 0.3, 0.4,0.5)
(0.2) (0.2, 0.3) (0.2, 0.3, 0.4) (0.2, 0.3, 0.4, 0.5)
(0.3) (0.3, 0.4) (0.3, 0.4, 0.5)
(0.4) (0.4, 0.5)
(0.5)
0.1 5 = 5 * 1 5-0 * 0+1 N=5
0.2 8 = 4 * 2 5-1 * 1+1
0.3 9 = 3 * 3 5-2 * 2+1 // (N - i)*(i + 1);
0.4 8 = 2 * 4 5-3 * 3+1
0.5 5 = 1 * 5 5-4 * 4+1
如{0.1, 0.2, 0.3, 0.4}
(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)
0.1 4 = 4 * 1 4-0 * 0+1 N=4
0.2 6 = 3 * 2 4-1 * 1+1 // (N - i)*(i + 1);
0.3 6 = 2 * 3 4-2 * 2+1
0.4 4 = 1 * 4 4-3 * 3+1
......
...
所以 每个数出现的次数 就是 (N-i)*(i+1)
还有一种思路 就是 判断 i 会出现在哪些子区间里面
比如 1---------i--------n
i 的 左端点 在1-i
i 的 右端点在 i-n
所以 i 的可选情况 有 (i+1) (n-i)
还有第三种思路 :后期补
这里给出 前两种思路的 代码实现:
#include <stdio.h>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <string>
#include <cstring>
#include <algorithm>
#include <ctime>
using namespace std;
double num[100005];
int main()
{
int N;
cin>>N;
for (int i = 0; i < N; ++i)
{
cin>>num[i];
}
double sum=0.0;
for (int i = 0; i < N; ++i)
{
sum += (N - i)*num[i]*(i + 1);
}
printf("%.2lf\n",sum);
return 0;
}
提交代码