测试点解析:1049 数列的片段和_12行代码AC
立志用更少的代码做更高效的表达
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相关推荐
- 【测试点分析】1088 三人行 (20分)_29行代码AC
立志用最少的代码做最高效的表达 PAT乙级最优题解-->传送门 子曰:"三人行,必有我师焉.择其善者而从之,其不善者而改之." 本题给定甲.乙.丙三个人的能力值关系为:甲的能 ...
- 【测试点分析】1010 Radix (25 分)_37行代码AC
立志用最少的代码做最高效的表达 PAT甲级最优题解-->传送门 Given a pair of positive integers, for example, 6 and 110, can th ...
- 1054 The Dominant Color (20 分)_12行代码AC
立志用最少的代码做最高效的表达 PAT甲级最优题解-->传送门 Behind the scenes in the computer's memory, color is always talke ...
- Pat乙级 1049 数列的片段和
Pat乙级 1049 数列的片段和 思路 代码 题目网址 https://pintia.cn/problem-sets/994805260223102976/problems/994805275792 ...
- 1049. 数列的片段和(20)
1049. 数列的片段和(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 给定一个正数数列,我们可以从中截 ...
- C++学习之路 | PTA乙级—— 1049 数列的片段和 (20 分)(精简)
1049 数列的片段和 (20 分) 给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列 { 0.1, 0.2, 0.3, 0.4 },我们有 (0.1) (0.1, 0. ...
- 1049. 数列的片段和
给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列{0.1, 0.2, 0.3, 0.4},我们有(0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1 ...
- 【PAT乙级】1049 数列的片段和 (20 分)
题目地址 #include<cstdio> #include<iostream> #include<cmath> using namespace std; int ...
- 【测试点三、四、五分析】1032 Sharing (25 分)_28行代码AC
立志用最少的代码做最高效的表达 PAT甲级最优题解-->传送门 To store English words, one method is to use linked lists and sto ...
最新文章
- centos 7 mysql 创建用户_【CentOS 7MySQL常用操作4】,MySQL创建用户以及授权#180116
- 区块链:这项颠覆性技术将如何改变未来
- mysql 替换 多个逗号_如何使用mySQL replace()替换多个记录中的字符串?
- Mysql 常用函数(19)- mod 函数
- python tensorflow 智能家居_TensorFlow平台下的视频目标跟踪深度学习模型设计
- Unity3D的50个技巧:Unity3D最佳实践
- java中线程的生命周期_Java中的线程生命周期– Java中的线程状态
- python sorted下标_Python列表实用的代码片段
- Android-APP内存优化
- cad打印去掉边框_CAD中图片的边框怎么去除? - CAD自学网
- ubuntu 保存命令行操作记录
- 小白尝试——去除apk流氓权限
- 谷歌浏览器打开CSDN老是弹出安卓网页
- linux DMA机制实现(e1000资源分配)
- 「信号机制」Python信号处理—signal模块
- python学习:break用法详解
- 基础练习16-分解质因数
- 用计算机在作文格中打单字字,描写一个字的作文
- IT运维管理人力成本困境该如何破解?
- 辽宁2009对口计算机试题文档之家,2011年对口高考计算机试题