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;
}