1049 数列的片段和(附详细注释,逻辑分析,运行超时)

写在前面

  • 数据题(公式抽象)
  • 题目较难(个人角度)
    • 合理的逻辑思路,耗费时间点
    • 运行超时问题,耗费时间
  • a题失败,失去5分值
    • accumulate 函数,numeric 库

测试用例

input : 
4
0.1 0.2 0.3 0.4

output : 
5.00

运行超时代码

  • 优化后(15分,超时)
#include 
#include 
#include 

using namespace std;

int main()
{
    int n;
    scanf("%d",&n);
    double cur_zs = 0.0, sum = 0.0, sum_t = 0.0;
    vector<double> vec;

    for(int k=0; k<n; k++)
    {
        scanf("%lf", &cur_zs);
        vec.push_back(cur_zs);
    }

    for(int i=1; i<=n; i++)
    {
        sum_t = accumulate(vec.begin(), vec.begin()+i, 0.0);
        sum += sum_t;
        for(int j=1; j+i<=n; j++)
        {
            sum_t = sum_t-vec[j-1]+vec[j+i-1];
            sum += sum_t;
        }
    }

    printf("%.2lf", sum);

    return 0;
}

ac代码

  • 参考代码
#include
using namespace std;
int main()
{
    double n;
    scanf("%lf",&n);
    double sum=0.0, zs = 0.0;
    for(int i=1; i<=n; i++)
    {
        scanf("%lf",&zs);
        sum=sum + i*(n-i+1)*zs;  // i*(n-i+1) zs出现次数
        // sum += a[i] * ((i + 1) * (N - i)); // ((i + 1) * (N - i))在运算过程中会发生溢出!!!
    }
    printf("%.2lf",sum);
    return 0;
}
  • 原理分析图
    1049 数列的片段和(附详细注释,逻辑分析,运行超时)_第1张图片

参考文章

  • 1049 数列的片段和,推荐
  • 1049. 数列的片段和(20)-PAT乙级真题

你可能感兴趣的:(PAT(乙级),算法比赛相关)