时间:2024/2/10
非常基础的一个题目结果我写了好几天,实际上是一直在磨时间没有干什么正经的事情
思路很简单实际上更加多的是在计算标准差的处理方面的小技巧没有学到。
后面看了题解之后才恍然大悟。
希望自己反思一下在处理数据的精确度时的思想。
#### 解题思路
先从小到大排好,开始搜索小于平均数的值,小于的开始累计与平均数的差平方,一直到找到比平均数大的结束搜索,计算方差。
请在此处填写你的解题思路
```cpp
代码如下,有参考题解成分。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll n;
double sum=0,sum1=0,s;
cin>>n>>s;
int str[n];
//double sn[n];
for(int i=0; i<n; i++){cin>>str[i];}
//sum+=str[i];}
sum=s*1.0/n;
//cout<<sum;
sort(str,str+n);
for(int i=0; i<n; i++)
{
if(str[i]*(n-i)<s)
{
sum1+=(str[i]-sum)*(str[i]-sum);
s-=str[i];
}
//不管别人出多少钱,最后的平均值一定是s/n
//cout<<sum1;
else
{
double sum2=s*1.0/(n-i);
sum1+=(sum2-sum)*(sum2-sum)*(n-i);//这里别忘记要乘(n-i)
break;
}
}
printf("%.4lf",sqrt(sum1/n));
下面为我一开始的思想比较落后看了解析才摸出来一点点算方差的套路
//printf("%d ",str[n-1]);
// for(int i=n-1; i>=0; i--)
// {
// if(str[i]<sum)
// {
// sum1+=str[i];
// sn[i]=str[i];
// num--;
// sum+=(str[i]-sum)*1.0/num;
// }
// if(str[i]>=sum)sn[i]=sum;
// }
// sum1+=sum*num;
// sum1=sum1*1.0/n;
// //printf("%d ",sum1);
// for(int i=0; i<n; i++)
// {
// sum2+=pow(sn[i]-sum1,2);
// }
// sum2=sum2*1.0/n;
return 0;
}
```