2024年第十五届蓝桥杯C&C++大学A组--成绩统计
题目:


动态规划,
对于该题,考虑动态规划解法,先取前k个人的成绩计算其方差,并将成绩记录在数组中,记录当前均值,设小蓝已检查前i-1个人的成绩,若方差依然大于T,找出离均值最远的一个成绩,若第i个人的成绩距离当前均值更近,则剔除离均值较远的成绩,使得方差变小,若遍历完整个数组均找不到更小的方差,返回-1。
代码:
cpp
#include<bits/stdc++.h>
using namespace std;
int n, k, T;
vector<int> nums;
vector<int> team;
bool is0()
{
double mean,val;
double sum = 0;
for (auto num : team)
{
sum += num;
}
mean = sum / k;
val = 0;
for (auto num : team)
{
val += (num - mean) * (num - mean);
}
val /= k;
if (val < T)
return true;
else
return false;
}
int main()
{
cin >> n >> k >> T;
int N = n;
while (N--)
{
double temp;
cin >> temp;
nums.push_back(temp);
}
if (n < k)
{
cout << -1;
return 0;
}
double sum = 0;
for (int i = 0;i < k; i++)
{
team.push_back(nums[i]);
sum += nums[i];
}
double mean = sum / k;
if (is0())
{
cout << k;
return 0;
}
for (int i = k; i < nums.size(); ++i)
{
double sub = 0;
int x = -1;
for (int j = 0; j < team.size(); ++j)
{
if (abs(team[j] - mean) > sub)//找出距离平均值最远的值和下标
{
sub = abs(team[j] - mean);
x = j;
}
}
if (x != -1 && sub > abs(nums[i] - mean))
team[x] = nums[i];
if (is0())
{
cout << i + 1;
return 0;
}
return -1;
}
return 0;
}