|
思路解析
题目大意应该都懂,点一下坑点:1. 当总分相同,要按照“得满分”题目的个数进行降序;
2. 没提交过的和一次都没通过编译的人不参与排名,与得0分的是两个意思;
3. 哪一道题编译没通过就输出‘-’。
示例代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n, k, m;
struct node{
public:
int id,score = 0,num = 0;
int arr[6] = {-1,-1,-1,-1,-1,-1};
bool issub[6];//对每一道题是否提交过,没提交过输出-
bool hascom = false;//通过一次编译
bool hassub = false;//提交过
};
bool cmp(node n1,node n2) {
return n1.score != n2.score ? n1.score > n2.score : n1.num != n2.num ? n1.num > n2.num : n1.id < n2.id;
}
int main() {
scanf("%d %d %d", &n, &k, &m);
vector<int> que(k+1);
vector<node> vec(n + 1);
for (int i = 1; i <= k; i++)
scanf("%d", &que[i]);
for (int i = 0; i < m; i++) {
int uid, qid, sco;
scanf("%d %d %d", &uid, &qid, &sco);
vec[uid].id = uid;
vec[uid].issub[qid] = true;
vec[uid].hassub = true;//这个人提交过
if (sco != -1) //编译通过
vec[uid].hascom = true;
if (sco > vec[uid].arr[qid]) {//当前提交的分数比原来大
if (sco == que[qid]) //完美解题
vec[uid].num++;
vec[uid].arr[qid] = sco;
}
}
for (int i = 1; i <= n; i++) {//统计总分
for (int j = 1; j <= k; j++) {
if (vec[i].arr[j] >= 0)
vec[i].score += vec[i].arr[j];
}
}
sort(vec.begin(), vec.end(), cmp);
int rank = 1, pre = vec[0].score, count = 0;
for (int i = 0; i < n + 1; i++) {//因为排完序了,0号占据了元素
if (!vec[i].hascom || !vec[i].hassub) continue;//虽然continue掉了,但是排名还是多计了
count++;
if (vec[i].score == pre)
cout << rank << " ";
else {
cout << count << " ";
rank = count;
pre = vec[i].score;
}
printf("%05d %d", vec[i].id, vec[i].score);
for (int j = 1; j < k + 1; j++) {
if (!vec[i].issub[j]) //没有提交过
cout << " -";
else
vec[i].arr[j] == -1 ? cout << " 0" : cout << " " << vec[i].arr[j];
}
cout << endl;
}
return 0;
}