1080 MOOC期终成绩 (25 分)
题目链接
算法分析
学会用map和vector+结构体+sort!!!
map是一个优秀的数据结构,插入查找删除平均复杂度为log级别,对于这个题目的10000范围就十分必要。
关于我下面代码的一些解说:
1.为什么idx[]存下的元素一定要从1开始呢?这样不是下标还得减去1才能访问到vecotr中的元素吗?
答:这是为了方便判断是否该字符串已经被读入过,idx[]非0即为读入过,idx[]为0即为没有读入过。
2.+0.5的作用是什么?
答:四舍五入小技巧
3.string类型也可以printf输出吗?
答:可以的,比如声明一个string s 输出s时可以用printf("%s", s.c_str())把string转化为char类型字符数组后输出。
4.为什么在读入期末成绩时就直接赋值给了最终成绩?期中时为什么不这样做?
答:一个人如果不参加期末考试,他的成绩不能达到60分。
代码实现
#include<bits/stdc++.h>
using namespace std;
struct node{
string id;
int work, mid, final;//作业、期中、期末成绩
int mark;
};
map< string, int >idx;
vector< node > v, ans;
int cnt;
bool cmp(node a, node b){
return a.mark == b.mark ? a.id < b.id : a.mark > b.mark;
}
int main(){
int p, m, n;
string s;
int score;
scanf("%d%d%d", &p, &m, &n);
for(int i = 1; i <= p; ++ i){
cin>> s>> score;
if(score >= 200){
v.push_back(node{s, score, -1, -1, 0});
idx[s] = ++ cnt;
}
}
for(int i = 1; i <= m; ++ i){
cin>> s>> score;
if(idx[s]) v[idx[s] - 1].mid = score;
}
for(int i = 1; i <= n; ++ i){
cin>> s>> score;
if(idx[s]){
int temp = idx[s] - 1;
v[temp].final = v[temp].mark = score;
if(v[temp].mid > v[temp].final)
v[temp].mark = (int)(v[temp].mid * 0.4 + v[temp].final * 0.6 + 0.5);
}
}
for(int i = 0; i < cnt; ++ i)
if(v[i].mark >= 60) ans.push_back(v[i]);
sort(ans.begin(), ans.end(), cmp);
for(int i = 0; i < ans.size(); ++ i)
printf("%s %d %d %d %d\n", ans[i].id.c_str(), ans[i].work, ans[i].mid, ans[i].final, ans[i].mark);
return 0;
}