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

输入格式:

输入第一行给出一个不超过105的正整数N,表示数列中数的个数,第二行给出N个不超过1.0的正数,是数列中的数,其间以空格分隔。

输出格式:

在一行中输出该序列所有片段包含的数之和,精确到小数点后2位。

输入样例:

4
0.1 0.2 0.3 0.4 

输出样例:

5.00

解题思路:
主要是精度损失问题。在大量的数累加之后浮点数就会损失精度。计算的过程越多,误差累积越大。使用浮点型进行大量计算时要尽可能地减小计算。

算法思路:

数列{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.0

可以发现:
1.0 出现了 4 * 1 次,即 n 次。4 代表一列有 4 个 1.0,1 代表共有一列。
2.0 出现了 3 * 2 次,即 (n-1) * 2 次。3 代表一列有 3 个 2.0,2 代表共有二列。
3.0 出现了 2 * 3 次,即 (n-2) * 3 次。2 代表一列有 2 个 3.0,3 代表共有三列。
4.0 出现了 1 * 4 次,即 (n-3) * 4 次。1 代表一列有 1 个 4.0,4 代表共有四列。

于是总和就等于 \(\sum_{i=0}^{N-1}a[i] * (N - i) * (i + 1)\)。

值得注意的是:

sum += a[i] * (N - i) * (i + 1);

sum += (N - i) * (i + 1) * a[i];

这两种写法有所差距。第一种写法,三次运算每次都是 double 型,第二种写法,第一次运算结果是 int 型,有可能出现溢出。当 i = N/2 时,(N - i) * (i + 1) 的值最大,超过了 int 型所能表示的范围。你可以对第二种写法进行强制类型转换(转换成 long long int 或者 double 都可,推荐 long long int,这样至少在精度上少了一次损失),或者写成第一种那样,利用 C 语言的自动类型转换。

解题代码:

#include<stdio.h> 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 += (long long int)(N - i) * (i + 1) * a[i];}   printf("%.2f\n", sum);return 0;
}

转载于:https://www.cnblogs.com/andywenzhi/p/5837751.html

1049. 数列的片段和相关推荐

  1. Pat乙级 1049 数列的片段和

    Pat乙级 1049 数列的片段和 思路 代码 题目网址 https://pintia.cn/problem-sets/994805260223102976/problems/994805275792 ...

  2. 1049. 数列的片段和(20)

    1049. 数列的片段和(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 给定一个正数数列,我们可以从中截 ...

  3. C++学习之路 | PTA乙级—— 1049 数列的片段和 (20 分)(精简)

    1049 数列的片段和 (20 分) 给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列 { 0.1, 0.2, 0.3, 0.4 },我们有 (0.1) (0.1, 0. ...

  4. 测试点解析:1049 数列的片段和_12行代码AC

    立志用更少的代码做更高效的表达 Pat乙级最优化代码+题解+分析汇总-->传送门 给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列 { 0.1, 0.2, 0.3, ...

  5. 【PAT乙级】1049 数列的片段和 (20 分)

    题目地址 #include<cstdio> #include<iostream> #include<cmath> using namespace std; int ...

  6. PAT 乙级 ------ 1046~1050 划拳、编程团体赛、数字加密、数列的片段和、螺旋矩阵附思路和代码

      这个鬼天气欸,又降温到十几度了.看帖子的你,今天也要开心啊!!!PEACE & LOVE 1046 划拳 思路: 每次读取四个数,根据规则求和比较,只有一方胜利一方失败从才会喝酒,同赢同输 ...

  7. PAT1049 数列的片段和 (20 分)

    心得 在处理较大数据的时候,要注意处处防止溢出.就算结果是long long int型,过程中也不能出现int. 这道题不难,易错点就在溢出上.一开始变量都定义成double,后两个测试点不通过.改成 ...

  8. 【PAT乙级题库】全套总结

    我将难度分为三个等级: 简单 中等 难 简单的做一次足以,做再多遍也无任何的意义. 中等的可以多刷几遍 难的多刷几遍 目录 1001 害死人不偿命的(3n+1)猜想[简单] 1002 写出这个数 (2 ...

  9. PAT乙级题目答案汇总PAT (Basic Level) Practice (中文)

    1001 害死人不偿命的(3n+1)猜想 (15 分) #include <bits/stdc++.h> using namespace std; int main(){ios::sync ...

最新文章

  1. toad for oracle xpert edition,Toad for oracle 软件产品模块对比,方便大家选型
  2. css多行超出显示点_CSS实现单行、多行文本溢出显示省略号(…)
  3. 标准日本语初级上第一单元 第一课[李さんは 中国人です]
  4. redis mysql主从延迟_MySQL主从延迟问题解决
  5. 神器!微软发布 Python 的 JIT 编译器:Pyjion!
  6. html css a标签的应用
  7. Scrapy网络爬虫实战[保存为Json文件及存储到mysql数据库]
  8. golang byte转string_golang版memcached之groupcache缓存入门
  9. Azkaban 进程和任务监控(任务状态从MySQL同步到SqlServer)
  10. mysql5.5源码安装_MySQL5.5源码安装
  11. 【Python】 html解析BeautifulSoup
  12. 线程生命周期与创建线程的多种方式
  13. EXCEL如何将平均值加减标准差设置为科学计数法显示
  14. 主页被锁定为 hao.360.cn
  15. 计算机技术复试新浪微博,四川大学计算机学院复试经验交流
  16. Linux perf 1.1、perf_event内核框架
  17. html css小圆圈,jquery+css3实现会动的小圆圈效果
  18. CQYZ Online Judge P2995 萨鲁曼的大军(c++)
  19. 阿里云APP备案操作流程 新手看过来
  20. VnlnHub Momentum

热门文章

  1. Mysql高性能优化规范建议,太厉害了!
  2. 黄了。Google中国版搜索
  3. Java集合:HashMap
  4. IntelliJ IDEA配置maven,并创建一个实例作为演示
  5. 【Python】青少年蓝桥杯_每日一题_4.15_正方形里面套个实心圆形
  6. python elseif用法_python学习笔记(一)
  7. 一个图片 在另一个图片定位_淋雨图片孤身一人 一个人在淋雨的图片_新闻资讯...
  8. java arraylist 对象 删除_ArrayList实现删除重复元素(元素不是对象类型的情况)...
  9. Python编程语言学习:包导入和模块搜索路径简介、使用方法之详细攻略
  10. TF之AE:AE实现TF自带数据集数字真实值对比AE先encoder后decoder预测数字的精确对比—daidingdaiding