题目:
若x1,x2,x3......xn的平均数为k。
则方差s^2 = 1/n * [(x1-k)^2+(x2-k)^2+.......+(xn-k)^2] 。
方差即偏离平方的均值,称为标准差或均方差,方差描述波动程度。
给出M个数,从中找出N个数,使这N个数方差最小。
Input
第1行:2个数M,N,(M > N, M <= 10000)
第2 - M + 1行:M个数的具体值(0 <= Xi <= 10000)
Output
输出最小方差 * N的整数部分。
Input示例5 3 1 2 3 4 5Output示例2
此题就是 先排下序,因为要找出方差最小,肯定是排序后的某一段连续的排好序的数字~ 然后就注意下本题的精度的问题,long long 与 double 的基本问题~ 还有一行代码,首次使用,自己特意标注一下:
long long min = 1ll<<60;
这样得出的 min 结果是 接近无穷大的,运行结果是 1152921504606846976 。
完整代码:
#include <iostream> #include <algorithm> #include <cmath> using namespace std; int main() { int n,m; cin >> n >> m; double a[n]; for(int i=0; i<n; i++) cin >> a[i]; sort(a,a+n); double k[n]; for(int i=0; i<n-m+1; i++) { double sum = 0; for(int j=i; j<i+m; j++) { sum += a[j]; } k[i] = (double)sum / m; } long long min = 1ll<<60; double summ; for(int i=0; i<n-m+1; i++) { summ = 0; for(int j=i; j<i+m; j++) { summ += (double)(a[j] - k[i])*(a[j] - k[i]); } if(summ < min) min = summ; } cout << (long long)min << endl; return 0; }