1049. 数列的片段和(20)

原题: https://www.patest.cn/contests/pat-b-practise/1049

思路:

1. a                               = a
2. a+(a+2b)                        = 2a+2b
3. a+(a+2b)+(a+2b+3c)              = 3a+4b+3c
4. a+(a+2b)+(a+2b+3c)+(a+2b+3c+4d) = 4a+6b+6c+4d

左边的规律显而易见, 累加即可. 右边的规律我参考了网友的实现, 才明白.
比如现在n=4, i=1, 4a = a * n-i+1 * i, 后面的类推.

本题我最郁闷的就是使用累加的方案, 测试点2始终无法AC, 估计是精度的原因
但我实在看不出, 精度怎么错了, 如有大神明白, 望告知, 不胜感激!

前些天, 在牛客上看一个算法直播, 主播现场做了一道Google给出的算法题,
让我惊叹的是最后他提交的时候, 直接从Google服务器上下载一个文件, 这个
文件就是全部的输入, 然后使用C语言操作文件生成一个文件输出, 最后提交
这个输出文件, 到服务器端验证. 现在想想这个功能太TM有用了, 比如现在
这题, 我是真想知道到底那组输入数据, 累加和累乘得到的结果不一样!!!

累乘实现1 (AC):

#include <stdio.h>

int main (void) {
    int n;
    double sum = 0.0;
    double tmp;
    int i;
    scanf("%d", &n);
    for (i = 1; i <= n; i++) {
        scanf("%lf", &tmp);
        sum += tmp * (double)(n - i + 1) * (double)(i);
    }
    printf("%.2f\n", sum);

    return 0;
}

累加实现2 (测试点2不过):

#include <stdio.h>

int main (void) {
    int n;
    double inc = 0.0;
    double sum = 0.0;
    double tmp;
    int i;
    scanf("%d", &n);
    for (i = 1; i <= n; i++) {
        scanf("%lf", &tmp);
        inc += (double)(i) * tmp;
        sum += inc;
    }
    printf("%.2f\n", sum);

    return 0;
}

posted @ 2017-12-05 18:05  阿胜4K  阅读(415)  评论(0编辑  收藏  举报