分析:
20分,暴力求解多半超时,需要降低时间复杂度列出N = 4 的所有子序列(底色黄),找规律(最简方法见最后方,该分析有问题) 也就是说,将所有底为黄的数字相加就是要输出的结果了横着看的话,当序列第i个元素i开头,该行的所有和就等于i个i的全序列和(即从第一个元素相加到第i个元素)相加,再减去i之前的所有全序列和所以,在输入时就计算出i的全序列和,放入数组中,就简单了代码如下
#include <iostream> using namespace std; double Sub[100005], Sum[100005]; int main() { int N; scanf("%d", &N); double sum = 0, temp; //这里sum统计从Sub[i]到Sub[j]的和,并放在Sum[j]中 for(int i = 0; i < N; i++) { scanf("%lf", &Sub[i]); sum += Sub[i]; Sum[i] = sum; } double sum1 = 0, sum2 = 0; //sum1输出值 sum2要减的值 for(int i = 0; i < N; i++) { sum1 += Sum[i] * (i+1); sum1 -= sum2; sum2 += Sum[i]; } printf("%.2lf", sum1); }反馈
该代码不能通过测试点2,答案错误;猜测是在大量的加减运算中损失了精度更简单准确的方法见此博客https://blog.csdn.net/SM20155201314/article/details/88385890