立志用更少的代码做更高效的表达


Pat乙级最优化代码+题解+分析汇总——>传送门


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

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

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

输入样例:
4
0.1 0.2 0.3 0.4
输出样例:
5.00


解题思路

最先想到的解法一定是二重循环累加。

一般来讲, 200ms最多支持200w次左右的循环运算, 以本题最大数据量10w次计算, 10w*10w的数据量要远远高于200w,因此常规解法行不通。

对于这种大数据量的题, 很常见的一种解法是找规律, 找到规律,推导出数学公式, 就可以在O(n)的数量级内解题。

经过推导我们发现: 对于样例输入,有:
sum=0.1∗1∗4+0.2∗2∗3+0.3∗3∗2+0.4∗4∗1sum = 0.1*1*4 + 0.2*2*3 + 0.3*3*2 + 0.4*4*1sum=0.1∗1∗4+0.2∗2∗3+0.3∗3∗2+0.4∗4∗1

规律显而易见, 列for循环求解即可。

提交代码后, 发现样例2无法通过

百般调试无果后, 到网上寻找帮助。

大神对此的解答是:浮点型精度往往是有误差的,如1.2用浮点型数据保存,可能会变成:1.200003423213。
因此, 如果对浮点型精度进行大数据量的运算, 可能会导致误差累积,影响最终结果。

解决办法是: 将输入的小数乘1000,用long long型变量存储, 最后除以1000输出即可。

注意:网上的很多代码并非满分代码,测试点2无法通过!一定要注意甄别!


代码展示

#include<stdio.h>
int main() {int n; scanf("%d", &n);long long sum = 0;for(int i = 1; i <= n; i++) {double x; scanf("%lf", &x);sum += (long long)(1000*x) * (n-i+1) * i; }printf("%.2lf\n", sum/1000.0);return 0;
}

耗时

10w次耗时20ms左右, 和我们预估的耗时相差不大。


总结:

1. 用浮点型变量进行大量数据运算时,可能会出现误差。
2. 对于大数据量,限制时间短的题型, 往往采用推导公式的方法解题,这在ACM中尤其普遍。
3. 如果本篇文章对大家产生了帮助,记得多多点赞! 让更多的人看到它~

测试点解析:1049 数列的片段和_12行代码AC相关推荐

  1. 【测试点分析】1088 三人行 (20分)_29行代码AC

    立志用最少的代码做最高效的表达 PAT乙级最优题解-->传送门 子曰:"三人行,必有我师焉.择其善者而从之,其不善者而改之." 本题给定甲.乙.丙三个人的能力值关系为:甲的能 ...

  2. 【测试点分析】1010 Radix (25 分)_37行代码AC

    立志用最少的代码做最高效的表达 PAT甲级最优题解-->传送门 Given a pair of positive integers, for example, 6 and 110, can th ...

  3. 1054 The Dominant Color (20 分)_12行代码AC

    立志用最少的代码做最高效的表达 PAT甲级最优题解-->传送门 Behind the scenes in the computer's memory, color is always talke ...

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

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

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

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

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

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

  7. 1049. 数列的片段和

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

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

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

  9. 【测试点三、四、五分析】1032 Sharing (25 分)_28行代码AC

    立志用最少的代码做最高效的表达 PAT甲级最优题解-->传送门 To store English words, one method is to use linked lists and sto ...

最新文章

  1. centos 7 mysql 创建用户_【CentOS 7MySQL常用操作4】,MySQL创建用户以及授权#180116
  2. 区块链:这项颠覆性技术将如何改变未来
  3. mysql 替换 多个逗号_如何使用mySQL replace()替换多个记录中的字符串?
  4. Mysql 常用函数(19)- mod 函数
  5. python tensorflow 智能家居_TensorFlow平台下的视频目标跟踪深度学习模型设计
  6. Unity3D的50个技巧:Unity3D最佳实践
  7. java中线程的生命周期_Java中的线程生命周期– Java中的线程状态
  8. python sorted下标_Python列表实用的代码片段
  9. Android-APP内存优化
  10. cad打印去掉边框_CAD中图片的边框怎么去除? - CAD自学网
  11. ubuntu 保存命令行操作记录
  12. 小白尝试——去除apk流氓权限
  13. 谷歌浏览器打开CSDN老是弹出安卓网页
  14. linux DMA机制实现(e1000资源分配)
  15. 「信号机制」Python信号处理—signal模块
  16. python学习:break用法详解
  17. 基础练习16-分解质因数
  18. 用计算机在作文格中打单字字,描写一个字的作文
  19. IT运维管理人力成本困境该如何破解?
  20. 辽宁2009对口计算机试题文档之家,2011年对口高考计算机试题

热门文章

  1. 第09讲:爬虫解析利器 PyQuery 的使用
  2. 音视频技术开发周刊 | 176
  3. 通过视频着色进行自监督跟踪
  4. 如何搭建低延时、交互式的在线教育平台?(内附视频回放)
  5. 2019年低延迟直播技术展望
  6. ffmpeg.c学习-1-框架分析及命令行解析
  7. Hadoop之Hadoop基础知识面试复习
  8. 大牛书单 | 腾讯运维大咖陪你过724
  9. 判断目录是否存在并创建mkdir
  10. Python pip更换升级源