1080 MOOC期终成绩 (25 分)

78 阅读2分钟

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;
}