1137 Final Grading (PAT 甲级)

写完后又参考其他人的写法修改了一下:发现既然只有取得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.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值