P6363 [传智杯 #2 初赛] 软件工程实习 ----- 模拟 + 结构图数组 + 自定义排序 + 题目要求检测 + round(四舍五入)
题目描述
某大学的《软件工程》必修课分为理论和实践部分。理论部分由该校教授完成授课;而实践部分是由第三方的公司主导,需要同学们在五周时间内自学 HTML、css、JavaScript、vue、Python、django 等技术,并组队完成一个真实的互联网商业应用。
参与这个课程的有 n(0\le n \le 1000)n(0≤n≤1000) 个学生,分成了不超过 2626 个队伍,每个队伍用 A
到 Z
来表示。每个队伍都会完成一个项目,并以队伍为单位,给所有队伍(包括自己队伍)打分,范围是 00 到 100100 的整数。
为了平息学生对这门课产生的出多问题的不满(比如工作量太大、时间过于紧张、考核方式不公平等),老师决定使用一种“看起来”很公平的方式来决定每组队伍的项目得分:
对于某个队伍,首先计算所有队伍(包括自己)给这个队伍评分的平均值,然后剔除掉和这个平均值差别超过 1515 分的评分(保证不会出现所有的评分全部被剔除的情况),最后再对剩余的评分求平均值,四舍五入取整后作为这个队伍的项目得分。
对于每一个同学,我们已经得知他们的队伍代号和理论成绩(也是 00 到 100100 分的整数)。这位同学的最后得分就是 60\%60% 的理论成绩加上 40\%40% 的所在队伍的项目得分,然后四舍五入取整。
现在老师想知道所有同学的分数排行。请按最后得分从高到低的顺序,输出每位同学的得分和他所在的队伍。
输入格式
第一行两个整数 nn 和 kk,分别表示学生数和队伍数。
接下来 nn 行,每行一个整数 s_isi 和一个大写字母 c_ici,表示第 ii 个选手的理论分数和队伍编号。保证队伍编号范围是从 A
开始后连续 kk 个字母中的一个。
接下来 kk 行,每行 kk 个整数。其中第 ii 行第 jj 列的整数 a_{i,j}ai,j 表示第 ii 个队伍给第 jj 个队伍的评分,当 i=ji=j 时,就是自评。
输出格式
输出 nn 行表示答案,得分高的同学优先输出,得分相同时队伍编号较小的同学优先输出。对于每一行,先输出这位同学成绩,然后输出代表他的队伍编号的大写英文字母。
输入输出样例
6 3 70 A 80 A 65 B 95 B 85 C 90 C 70 90 100 95 88 85 30 47 100
93 B 92 C 89 C 76 A 75 B 70 A
说明/提示
A 组收到的分数分别是 70,95,3070,95,30,其平均分为 6565,则 95,3095,30 被作为无效成绩剔除,因此 A 组的项目得分是 7070 分。
B 组收到的分数分别是 90,88,4790,88,47,其平均分为 7575,则 4747 被作为无效成绩剔除,因此 B 组的项目得分是 8989 分。
C 组收到的分数分别是 100,85,100100,85,100,其平均分为 9595,没有打分被剔除,因此 C 组的项目得分是 9595 分。
#include <iostream> #include<iomanip> #include <math.h> #include <vector> #include <unordered_set> #include <algorithm> #include <numeric> #include<stdio.h> using namespace std; struct student { // 结构体数组存放学生信息 double score; char team; int sum_all; }stu[1001]; bool my_sort(student stu1, student stu2) { // 自定义排序 if (stu1.sum_all != stu2.sum_all) return stu1.sum_all > stu2.sum_all; else if (stu1.sum_all == stu2.sum_all) return stu1.team - 'A' < stu2.team - 'A'; } int main(){ int n, k; vector<vector<int>> vec; // 二维数组存放 每一组的实践分数 cin >> n >> k; for (int i = 0; i < n; ++i) { // 输入每个学生的课程分数、队伍编号 cin >> stu[i].score >> stu[i].team; } for (int i = 0; i < k; ++i) { // 输入每个队伍获得的所有评分 vector<int> temp; for (int j = 0; j < k; ++j) { int a; cin >> a; temp.push_back(a); } vec.push_back(temp); } for (int i = 0; i < k; ++i) { for (int j = i; j < k; ++j) { swap(vec[i][j], vec[j][i]); } } for (int i = 0; i < k; ++i) { double averge; // 平均分 averge = double(accumulate(vec[i].begin(), vec[i].end(), 0)) / double(k); //cout << endl << "第" << i << "组的初始平均分" << averge << endl; int count = 0; for (int j = 0; j < k; ++j) { if (abs(vec[i][j] - averge) > 15) { // 减去不合理分数 vec[i][j] = 0; count++; } } averge = round(accumulate(vec[i].begin(), vec[i].end(), 0) /double (k - count)); //更新平均分 //cout << endl << "更新后平均分" << averge << endl; for (int a = 0; a < n; ++a) { // 添加每个学生的实践分数 if (stu[a].team - 'A' == i) stu[a].sum_all = round(0.6 * stu[a].score + 0.4 * averge); //cout << a << "的实践分数" << stu[a].sum_all << endl; } } sort(stu , stu + n, my_sort); // 使用自定义排序 for (int i = 0; i < n ; ++i) { // 输出 cout << stu[i].sum_all << " " << stu[i].team << endl; } return 0; }
本文来自博客园,作者:slowlydance2me,转载请注明原文链接:https://www.cnblogs.com/slowlydance2me/p/16922025.html