此题为给定n个数中找出其中3个数的方差最小,并输出最小方差。
解题思路:方差最小,那么这三个数越接近越好,采用排序+滑动窗口的思想解决这一问题。
#include<iostream>
#include<vector>
#include<iomanip>
#include<cmath>
using namespace std;
double func(vector<int > data, int index, vector<long long> jifen, int num)
{
long long sum = 0;
for (int i = 0; i < 3; i++)
sum += data[index + i];
/*if (num == 3) 以上求和可用积分图思想优化
sum = jifen[2];
else
sum = jifen[index + 2] - jifen[index - 1];*/
long long result = 0;
for (int i = 0; i < 3; i++)
{
long long err = 3 * data[index + i] - sum;
result += err*err;
}
return result / 27.0;
}
int main()
{
double minvalue =INT_MAX;
int num;
vector<int > data;
int temp;
cin >> num;
if (num <= 2 || num >= 3000)
return 0;
for (int i = 0; i < num; i++)
{
cin >> temp;
data.push_back(temp);
}
for (int i = 0; i < num - 1;i++)
for (int j = i + 1; j < num; j++)
{
if (data[i] < data[j])
{
int t = data[i];
data[i] = data[j];
data[j] = t;
}
}
vector<long long > jifen(num, 0);
jifen[0] = data[0];
for (int i = 1; i < num; i++)
jifen[i] = jifen[i - 1] + data[i];
for (int i = 0; i < num - 2; i++)
{
double s = func(data, i, jifen, num);
if (s < minvalue)
minvalue = s;
}
/*int result = (minvalue + 0.005) * 100; //0.10只会输出0.1
cout << result / 100.0 << endl;*/
cout <<fixed<< setprecision(2) << minvalue << endl;
system("pause");
return 0;
}