PAT甲级_1104(Sum of Number Segments)

1104 段的数字和

给定一个正数序列,定义一个连续的子序列为一段。例如给定序列{ 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)

AC代码`
#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;
}

你可能感兴趣的:(PAT甲级)