#HT1056. 标准差
标准差
UPDATE(2021.08.06 09:58): 由于评测机压力带来的评测波动已不可忽视,本题将时间限制由 500ms 调整到了 1000ms
题目背景
标准差是一组数值自平均值分散开来的程度的一种测量观念。一个较大的标准差,代表大部分的数值和其平均值之间差异较大;一个较小的标准差,代表这些数值较接近平均值。
题目描述
本题采用 NOI 系列赛事常见的“文件输入输出”模式评测
输入文件名:sigma.in
,输出文件名:sigma.out
输入 个数,第 个数为 ,输出这 个数的标准差(保留两位小数)。
标准差为方差的算数平方根,方差为每个数与平均数的差的平方之和除以数的个数。
比如五个数 时:
用数学符号表示的话,可以表示为:
输入格式
输入第一行为一个整数 ,表示有 个数。
输入第二行为空格隔开的 个整数,第 个整数为 。
输出格式
输出一行,为保留了两位小数的标准差。
样例
5
3 2 7 6 8
2.32
5
2 2 2 2 2
0.00
数据范围
对于 的数据:;
对于 的数据:、。
提示
文件输入输出
文件输入输出是 NOI 系列赛事常见的一种输入输出模式,题目中会写明输入及输出的文件名。写代码时只需要正常完成后,在 main()
函数的开始加入两行语句即可。
#include <cstdio>
...
int main(){
freopen("输入文件名", "r", stdin);
freopen("输出文件名", "w", stdout);
...
}
调试时可以先把这两行注释掉,调试成功后提交前取消注释即可。
如果使用 dev-cpp 等 IDE 编写代码,也可以在源代码文件相同的目录下,创建一个输入文件名的同名文件,用记事本打开后,写上样例输入,这样编译运行程序后,会自动创建一个输出文件名的文件,用记事本打开后就是你的程序的输出。
输入输出加速
本题输入输出量非常大,可以按照下列方式加速输入输出。
方案1
头文件加入 #include <cstdio>
,然后仅使用 scanf
、printf
进行输入输出。
方案2
在 main()
函数的开始加入两行代码。这两行代码可以关闭输入输出流同步,解除 cin
、cout
绑定。
...
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
...
}
然后仅使用cin
、cout
进行输入输出,且所有换行使用 '\n'
,不使用 endl
即可。
如果再搭配上文件输入输出,则 main()
函数的开始可以这样写:
...
int main(){
freopen("输入文件名", "r", stdin);
freopen("输出文件名", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0);
...
}
保留 位小数的方法
方案 1
- 头文件:
#include <cstdio>
- 语句:
printf("%.xf", a);
方案 2
- 头文件:
#include<iostream>
、#include<iomanip>
- 语句:
cout << fixed << setprecision(x) << a;
注意
如果题目说保留 位小数,那么就按照这种方式输出就可以了。
但是需要注意的是,这种方式并不是我们直观中的四舍五入。
对于 舍和 入的部分是没有问题的,对于舍入位是 ,且后面还有大于 的数位时也是没有问题的。但如果舍入位是 且后没有其他数了,那么有可能会有两个小问题。
首先这种情况下,如果是 double
类型可以精确储存的数,那么会舍入到最接近的偶数数位,比如在保留 位小数的情况下:
- ->
- ->
- ->
- ->
保留 位小数的情况下:
- ->
- ->
如果是 double
类型无法无法精确储存的数,实际上储存的数可能会有一点点偏差,也会造成和我们所想不同。
比如如果输入 ,那么保留 位小数输出的会是 ,因为保留 位小数输出后,我们会发现实际储存的数大概是 ,执行的自然是 舍操作。