PAT排名的计算。
注意如果有人提交了,没有编译通过就是-1的情况,计分是算0分的。
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#define MAX 10010
using namespace std;
struct stu {
int id;
int scoreSum;
int prefectCount;
int rank;
int scorel[8];
stu() { scoreSum = 0; prefectCount = 0; for (int i = 0; i < 8; i++) scorel[i] = -2; }
};
stu l[MAX];
bool isVis[MAX];
int scoreP[8];
vector <int> list;
int n, m, k;
bool cmp(int n1, int n2) {
if (l[n1].scoreSum != l[n2].scoreSum) {
return l[n1].scoreSum > l[n2].scoreSum;
}
else if (l[n1].scoreSum == l[n2].scoreSum && l[n1].prefectCount != l[n2].prefectCount){
return l[n1].prefectCount > l[n2].prefectCount;
}
else
return l[n1].id < l[n2].id;
}
int main() {
cin >> n >> m >> k;
memset(isVis, false, sizeof(isVis));
for (int i = 1; i <= m; i++) {
scanf("%d", &scoreP[i]);
}
int stuid, pid, s;
for (int i = 0; i < k; i++) {
scanf("%d%d%d", &stuid, &pid, &s);
l[stuid].id = stuid;
if (s > l[stuid].scorel[pid]) {
l[stuid].scorel[pid] = s;
if (s == scoreP[pid])
l[stuid].prefectCount++;
if (s >= 0 && !isVis[stuid]) {
isVis[stuid] = true;
list.push_back(stuid);
}
}
}
for (int i = 0; i < list.size(); i++) {
for (int j = 1; j <= m; j++) {
if (l[list[i]].scorel[j] != -1 && l[list[i]].scorel[j] != -2) {
l[list[i]].scoreSum += l[list[i]].scorel[j];
}
}
}
sort(list.begin() , list.end(), cmp);
int r = 1; int pre = list[0];
l[pre].rank = r;
for (int i = 1; i < list.size(); i++) {
if (l[list[i]].scoreSum == l[pre].scoreSum)
l[list[i]].rank = r;
else {
r = i + 1;
l[list[i]].rank = r;
pre = list[i];
}
}
for (int i = 0; i < list.size(); i++) {
printf("%d %05d %d", l[list[i]].rank, l[list[i]].id, l[list[i]].scoreSum);
for (int j = 1; j <= m; j++) {
if (l[list[i]].scorel[j] == -2)
printf(" -");
else if (l[list[i]].scorel[j] == -1)
printf(" 0");
else
printf(" %d", l[list[i]].scorel[j]);
}
printf("\n");
}
return 0;
}