1104 Sum of Number Segments(20 分)

1104 Sum of Number Segments(20 分)

Given a sequence of positive numbers, a segment is defined to be a consecutive subsequence. For example, given the sequence { 0.1, 0.2, 0.3, 0.4 }, we have 10 segments: (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) and (0.4).

Now given a sequence, you are supposed to find the sum of all the numbers in all the segments. For the previous example, the sum of all the 10 segments is 0.1 + 0.3 + 0.6 + 1.0 + 0.2 + 0.5 + 0.9 + 0.3 + 0.7 + 0.4 = 5.0.
Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N, the size of the sequence which is no more than 10​5​​. The next line contains N positive numbers in the sequence, each no more than 1.0, separated by a space.
Output Specification:

For each test case, print in one line the sum of all the numbers in all the segments, accurate up to 2 decimal places.
Sample Input:

4
0.1 0.2 0.3 0.4

Sample Output:

5.00

题意:给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段。例如,给定数列{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) 这10个片段。

给定正整数数列,求出全部片段包含的所有的数之和。如本例中10个片段总和是0.1 + 0.3 + 0.6 + 1.0 + 0.2 + 0.5 + 0.9 + 0.3 + 0.7 + 0.4 = 5.0。

思路:三层for模拟,第一个for控制从第i个数开始截取,第二个for控制以a[i]为首的片段长度,第三个for累加该片段中所有数字的和,这种方法是很容易想到的,但很不幸,运行超时。

#include <cstdio>
using namespace std;
int main(){
    int n;
    scanf("%d", &n);
    double a[n];
    for(int i = 0; i < n; i++){
        scanf("%lf", &a[i]);
    }
    double sum = 0;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n-i; j++){
            double tsum = 0;
            for(int k = i; k <= i+j; k++){
                tsum += a[k];
            }
            sum += tsum;
        }
    }
    printf("%.2f", sum);
    return 0;
}

思路:然后就改进了一下,还是模拟,只不过减少为两层for,第一个for还是控制从第i个开始截取,
第二个for控制长度,结果仍然超时。

#include <cstdio>
using namespace std;
int main(){
    int n;
    scanf("%d", &n);
    double a[n];
    for(int i = 0; i < n; i++){
        scanf("%lf", &a[i]);
    }
    double sum = 0;
    for(int i = 0; i < n; i++){
        double tsum = 0;
        for(int j = i; j < n; j++){
            tsum += a[j];
            sum += tsum;
        }
    }
    printf("%.2f", sum);
    return 0;
}

思路:模拟的方法肯定不行,只能找规律,列个表即可

这里写图片描述

#include <cstdio>
using namespace std;
int main(){
    int n;
    scanf("%d", &n);
    double a[n];
    double sum = 0;
    for(int i = 0; i < n; i++){
        scanf("%lf", &a[i]);
        sum += a[i]*(i+1)*(n-i);
    }
    printf("%.2f", sum);
    return 0;
}
原文链接:加载失败,请重新获取