成绩排序取所有科目成绩中最高的排名.
开了4个数组模拟…. 注意成绩平均分四舍五入,并不能按总分排,其次成绩相等排名并排.
#include <cstdio>
#include <map>
#include <algorithm>
using namespace std;
const double eps = 1e-8;
const int MAXN = 2010;
struct node {
int id;
int num;
int rank;
friend bool operator<(const node &a, const node &b) {
return a.num > b.num;
}
};
node C[MAXN], M[MAXN], E[MAXN], A[MAXN];
map<int, pair<char, int> > s;
void ran(node a[], int n) {
a[1].rank = 1;
for (int i = 2; i <= n; i++) {
if (a[i].num == a[i-1].num)
a[i].rank = a[i-1].rank;
else
a[i].rank = i;
}
}
void ins(node a[], char c, int n) {
for (int i = 1; i <= n; i++)
{
if (s[a[i].id].second > a[i].rank) {
s[a[i].id].first = c;
s[a[i].id].second = a[i].rank;
}
}
}
int main() {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d%d%d%d", &C[i].id, &C[i].num, &M[i].num, &E[i].num);
A[i].id = M[i].id = E[i].id = C[i].id;
A[i].num = C[i].num + M[i].num + E[i].num;
A[i].num = A[i].num * 1.0 / 3 + 0.5 + eps;
}
sort(C+1, C+n+1);
sort(M+1, M+n+1);
sort(E+1, E+n+1);
sort(A+1, A+n+1);
ran(C, n);
ran(M, n);
ran(E, n);
ran(A, n);
for (int i = 1; i <= n; i++)
s.insert(make_pair(A[i].id, make_pair('A', A[i].rank)));
ins(C, 'C', n);
ins(M, 'M', n);
ins(E, 'E', n);
for (int i = 1; i <= m; i++) {
int id;
scanf("%d", &id);
if (s.count(id))
printf("%d %c\n", s[id].second, s[id].first);
else
printf("N/A\n");
}
return 0;
}
本文介绍了一种用于学生成绩排序的算法实现,通过四个不同科目的成绩进行综合排名,并考虑了成绩相同时的并列排名处理。该算法使用C++编写,涉及数组排序、成绩平均分四舍五入计算等功能。
480

被折叠的 条评论
为什么被折叠?



