CCCC团体程序设计天梯赛 L2-015 互评成绩
记录天梯赛题目合集 跳转查看
题目描述
学生互评作业的简单规则是这样定的:每个人的作业会被\(k\)个同学评审,得到\(k\)个成绩。系统需要去掉一个最高分和一个最低分,将剩下的分数取平均,就得到这个学生的最后成绩。本题就要求你编写这个互评系统的算分模块。
输入格式:
输入第一行给出\(3\)个正整数\(N\)($3 < N \le 10^4 $,学生总数)、 \(k\)(\(3 ≤ k ≤ 10\),每份作业的评审数)、 \(M\)(\(\le 20\),需要输出的学生数)。随后\(N\)行,每行给出一份作业得到的\(k\)个评审成绩(在区间\([0, 100]\)内),其间以空格分隔。
输出格式:
按非递减顺序输出最后得分最高的\(M\)个成绩,保留小数点后3位。分数间有1个空格,行首尾不得有多余空格。
题目解析
对于每一个同学的 \(K\) 个成绩,求和后减去最大最小值,得到新的分数,先按这个分数进行排序得到得分最高的 \(M\) 个同学,在输出时求平均数。
没有太难的点,按照题意设计即可。
代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <stack>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const ll inf = 1e18;
const int INF = 0x3f3f3f3f;
const int N = 1e6 + 10;
int n, k, m;
void solve()
{
	cin >> n >> k >> m;
	vector<int> a(n);
	for (int i = 0; i < n; i ++) {
		int maxv = 0, minv = INF, sum = 0;
		for (int j = 0; j < k; j ++) {
			int x;
			cin >> x;
			sum += x;
			maxv = max(maxv, x);
			minv = min(minv, x);
		}
		a[i] = sum - minv - maxv;
	}
	
	sort(a.begin(), a.end());
	vector<int> res;
	for (int i = max(0, n - m); i < n; i ++) res.emplace_back(a[i]);
	for (int i = 0; i < res.size(); i ++) {
		if (i) printf(" ");
		printf("%.3lf", 1.0 * res[i] / (k - 2));
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr), cout.tie(nullptr);
	
	int T = 1;
//	cin >> T;
	while (T --) solve();
	return 0;
}

                
            
        
浙公网安备 33010602011771号