1080 MOOC期终成绩
思路:
- 结构体:里面5个变量,分别是编号和4个成绩。创建一个10005大小的结构体列表。
- 2个map分别存储每个学生的编程分数、期中分数
- 三次for循环读取输入,前两次存到map里,最后一次读编号和期末成绩可以直接输入到结构体里,顺便把前两个map里的成绩也输入进结构体。
- 对结构体列表进行排序,自己写sort的compare函数
- 按顺序输出合格的人,若编程分数小于200或者总成绩小于60则continue跳过
坑点:
- 总成绩要求四舍五入,算出来+0.5然后转int即可,经典转换。
- 注意,题目要求如果有一个成绩不存在则输出为-1,但是这里其实只有期中考试的成绩是可以不存在的,编程成绩和期末考试成绩如果不存在则必然不合格。
- 一开始我把期中考试成绩初始化为0,最后用if语句做个判断,假如期中考试成绩为0则输出-1,这导致测试点3一直错误。原因是,可能会存在考了期中但是成绩就是0的学生,这样就应该直接输出0而不是-1。后来我把期中考试成绩初始化为-1,就过了。
#include<stdio.h>
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
struct student {
string id;
int prog = 0; // 编程成绩
int midd = -1; // 期中成绩
int fina = 0; // 期末成绩
int score = 0;
} S[10005];
map<string, int> pr, mi; // pr:学生编程成绩 mi:学生期中成绩
bool compare(student s1, student s2) {
if (s1.score == s2.score) { return s1.id < s2.id; }
else { return s1.score > s2.score; }
}
int main(int argc, char* argv[]) {
int p, m, n; cin >> p >> m >> n;
for (int i = 0; i < p; i++) {
string s;
int x;
cin >> s >> x;
pr[s] = x;
}
for (int i = 0; i < m; i++) {
string s;
int x;
cin >> s >> x;
mi[s] = x;
}
for (int i = 0; i < n; i++) {
string s;
int x;
cin >> s >> x;
S[i].id = s;
S[i].fina = x;
if (pr.find(s) != pr.end()) { S[i].prog = pr[s]; }
if (mi.find(s) != mi.end()) { S[i].midd = mi[s]; }
if (S[i].fina < S[i].midd) { S[i].score = S[i].fina * 0.6 + S[i].midd * 0.4 + 0.5; } // 加0.5是为了四舍五入到整数
else { S[i].score = S[i].fina; }
}
sort(S, S + n, compare);
for (int i = 0; i < n; i++) {
if (S[i].prog < 200 || S[i].prog > 900 || S[i].midd > 100 || S[i].fina > 100 || S[i].score < 60) { continue; }
// if (S[i].midd == 0) { S[i].midd = -1; }
cout << S[i].id << " " << S[i].prog << " " << S[i].midd << " " << S[i].fina << " " << S[i].score << endl;
}
return 0;
}