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;
}
posted @ 2025-09-13 11:25  Natural_TLP  阅读(9)  评论(0)    收藏  举报