PAT 1137 C++版
1.题意
最近网上开课比较多,如慕课等网站。上完课需要给同学们颁发证书。但是领取证书是需要资格的。获取的资格如下:
- 平时分
program assignments需要>=200 - 可以没有期中考试分数,但是必须要有期末考试分数
- 计算最后的成绩时,计算公式如下:
G=(G mid−term ×40%+G final ×60%) if G mid−term >G final , or G final will be taken as the final grade G.
2.分析
2.1 方法1
做一道题首先需要一个清楚的思路,否则即使代码写的再快都得不到最优解。
针对三种不同的输入,如果我们分别使用结构体进行存储则相当费力,我们需要构建如下三种不同的结构体:
struct mid{
string id;
int midScore;
};
struct final{
string id;
int finalScore;
};
struct result{
string id;
int proAss = 0;
int midSco = -1;
int finalSco = -1;
int grade = 0;
};
但是因为使用了三个不同的结构体,这就容易导致出现的问题是:
- 不方便将id相同的学生的所有成绩放在一起,放在一个结构体中,需要两层for循环。这是相当耗时的。
- 同时如果使用三个结构体时,需要使用参加了final 考试的结构体作为最外层循环。因为如果要有成绩,必须有final考试的成绩。
针对上述的问题。我们尝试使用另外一种解题思路。
2.2 方式2
将学生的id作为key存储在map中,【根据题意可知:没有学生的id重复】将学生的其它成绩信息放在一个结构体中,作为value。即得到的一个map<string,result> stu;那么我们就可以不使用多层循环遍历出相同id的学生。其它的则相当简单了。
3.代码
#include<cstdio>
#include<string>
#include<set>
#include<map>
#include<cmath>
#include<algorithm>
#include<iostream>
#define maxn 10005
using namespace std;
struct result{
string id;
int proAss = 0;
int midScore = -1;
int finalScore = -1;
int grade = 0;
};
//定义三个结构体
int cmp(result r1,result r2){
if(r1.grade == r2.grade) return r1.id < r2.id;
return r1.grade > r2.grade;
}
int main(){
int P,M,N;
scanf("%d%d%d",&P,&M,&N);
int i,j,k;
string id;
int score;
int index = 0;
map<string,int> program;
map<string,result> stu;
result res[maxn];
for(i = 0;i < P;i++){
cin >> id >> score;
if(score >= 200){
stu[id].id = id;
stu[id].proAss = score;
}
}
for(i = 0;i< M ;i++){
cin >> id;
cin >> stu[id].midScore;//输入id 以及期中考试 成绩
}
for(i = 0;i< N ;i++){
cin >> id;
cin >> stu[id].finalScore;//输入id 以及期末考试 成绩
}
double grade = 0;
int count = 0;//所有的人数
for(map<string,result>::iterator it = stu.begin();it!=stu.end();it++){
//cout << it->first <<" " << it->second.proAss << endl;
if(it->second.proAss >= 200){//如果成绩 >= 200
if(it->second.midScore > it->second.finalScore){//如果 midScore > finalScore
grade = (it->second.midScore * 0.4) + (it->second.finalScore * 0.6);
grade = round(grade);
}else{
grade = it->second.finalScore;
}
if(grade >= 60){
res[count].id = it->second.id;
res[count].proAss = it->second.proAss;
res[count].midScore = it->second.midScore;
res[count].finalScore = it->second.finalScore;
res[count].grade = grade;
count ++;
}
}
}
sort(res,res+count,cmp);
for(i = 0;i< count;i++){
cout << res[i].id <<" "
<< res[i].proAss <<" "
<< res[i].midScore <<" "
<< res[i].finalScore <<" "
<< res[i].grade << endl;
}
}
4.测试用例
6 6 7
01234 880
a1903 199
ydjh2 200
wehu8 300
dx86w 220
missing 400
ydhfu77 99
wehu8 55
ydjh2 98
dx86w 88
a1903 86
01234 39
ydhfu77 88
a1903 66
01234 58
wehu8 84
ydjh2 82
missing 99
dx86w 81