写完后又参考其他人的写法修改了一下:发现既然只有取得final exam成绩的学生才有最终成绩,那在42行到54行代码中,完全可以把最终成绩算出来(没有进行final exam的学生无最终成绩,不进入最终的排序)。
#include <algorithm>
#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>
struct stu {
std::string id;
int Gp = -1;
int Gmid = -1;
int Gfinal = -1;
int g = -1;
stu(std::string _id) : id(_id) {}
};
int P, M, N, grade, cnt;
std::string id;
std::vector<stu> vec, result;
std::unordered_map<std::string, int> students;
bool cmp(const stu &a, const stu &b) {
return a.g != b.g ? a.g > b.g : a.id < b.id;
}
int main() {
std::cin >> P >> M >> N;
cnt = 0;
for (int i = 0; i < P; ++i) {
std::cin >> id >> grade;
if (grade >= 200) {
students.insert({id, cnt++});
vec.push_back(stu(id));
vec[vec.size() - 1].Gp = grade;
}
}
for (int i = 0; i < M; ++i) {
std::cin >> id >> grade;
if (students.find(id) != students.end()) {
vec[students[id]].Gmid = grade;
}
}
for (int i = 0; i < N; ++i) {
std::cin >> id >> grade;
if (students.find(id) != students.end()) {
stu curr = vec[students[id]];
curr.Gfinal = grade;
if (curr.Gmid > grade) {
curr.g = 0.4 * curr.Gmid + 0.6 * grade + 0.5;
} else {
curr.g = grade;
}
result.push_back(curr);
}
}
sort(result.begin(), result.end(), cmp);
for (int i = 0; i < result.size(); ++i) {
if (result[i].g >= 60) {
std::cout << result[i].id << " " << result[i].Gp << " " << result[i].Gmid
<< " " << result[i].Gfinal << " " << result[i].g << std::endl;
}
}
return 0;
}
题目如下:
For a student taking the online course "Data Structures" on China University MOOC (http://www.icourse163.org/), to be qualified for a certificate, he/she must first obtain no less than 200 points from the online programming assignments, and then receive a final grade no less than 60 out of 100. The final grade is calculated by G=(Gmid−term×40%+Gfinal×60%) if Gmid−term>Gfinal, or Gfinal will be taken as the final grade G. Here Gmid−term and Gfinal are the student's scores of the mid-term and the final exams, respectively.
The problem is that different exams have different grading sheets. Your job is to write a program to merge all the grading sheets into one.
Input Specification:
Each input file contains one test case. For each case, the first line gives three positive integers: P , the number of students having done the online programming assignments; M, the number of students on the mid-term list; and N, the number of students on the final exam list. All the numbers are no more than 10,000.
Then three blocks follow. The first block contains P online programming scores Gp's; the second one contains M mid-term scores Gmid−term's; and the last one contains N final exam scores Gfinal's. Each score occupies a line with the format: StudentID Score
, where StudentID
is a string of no more than 20 English letters and digits, and Score
is a nonnegative integer (the maximum score of the online programming is 900, and that of the mid-term and final exams is 100).
Output Specification:
For each case, print the list of students who are qualified for certificates. Each student occupies a line with the format:
StudentID
Gp Gmid−term Gfinal G
If some score does not exist, output "−1" instead. The output must be sorted in descending order of their final grades (G must be rounded up to an integer). If there is a tie, output in ascending order of their StudentID
's. It is guaranteed that the StudentID
's are all distinct, and there is at least one qullified student.