1. Descripción del título
原 题 链接
La lista de clasificación de PAT se genera a partir de la lista de estado, que muestra las puntuaciones de las presentaciones. Esta vez se supone que debes generar la lista de clasificación para PAT.
Especificación de entrada:
Especificación de salida:
Entrada de muestra:
7 4 20
20 25 25 30
00002 2 12
00007 4 17
00005 1 19
00007 2 25
00005 1 20
00002 2 2
00005 1 15
00001 1 18
00004 3 25
00002 2 25
00005 3 22
00006 4-1
00001 2 18
00002 1 20
00004 1 15
00002 4 18
00001 3 4
00001 4 2
00005 2-1
00004 2 0
Salida de muestra:
1 00002 63 20 25 - 18
2 00005 42 20 0 22 -
2 00007 42 - 25 - 17
2 00001 42 18 18 4 2
5 00004 40 15 0 25 -
Dos ideas para resolver problemas
Estructurar las preguntas de clasificación, colocamos a cada candidato en una estructura, que incluye id, número de preguntas AC, clasificación y mk (marque si el estudiante puede ser enviado por compilación), y una matriz de calificaciones, que representa la puntuación de cada pregunta. , Utilice la calificación [0] para representar la puntuación total. El código es fácil de entender, pero un poco más largo ...
Tres, código de CA
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 10010;
struct User
{
int id, perfect=0, rank, mk=-1;//mk: 是否有能通过编译的提交,若没有则不打印
int grade[6] = {
0, -1, -1, -1, -1, -1};
}u[maxn];
int p[6];
bool checked[maxn] = {
false}; //标记是否有过提交
bool cmp(User a, User b) //排序函数
{
if(a.grade[0] != b.grade[0]) return a.grade[0] > b.grade[0];
else if(a.perfect != b.perfect) return a.perfect > b.perfect;
else return a.id < b.id;
}
int main()
{
vector<User> all;
vector<int> idx;
int N, K, M, tmp, pid, tmpgrade;
scanf("%d%d%d", &N, &K, &M);
for(int i=1; i<=K; i++) scanf("%d", &p[i]);
for(int i=0; i<M; i++)
{
scanf("%d%d%d", &tmp, &pid, &tmpgrade);
u[tmp].id = tmp;
if(tmpgrade != -1) u[tmp].mk = 1; //有可以编译通过的题目
else tmpgrade = 0;
if(tmpgrade > u[tmp].grade[pid])
u[tmp].grade[pid] = tmpgrade;
if(checked[tmp]) continue;
else
{
checked[tmp] = true;
idx.push_back(tmp);
}
}
for(int i=0; i<idx.size(); i++)
{
for(int j=1; j<=K; j++)
{
if(u[idx[i]].grade[j]>=0)
{
u[idx[i]].grade[0] += u[idx[i]].grade[j];
if(u[idx[i]].grade[j] == p[j])
u[idx[i]].perfect++;
}
else continue;
}
if(u[idx[i]].mk > 0) all.push_back(u[idx[i]]);
}
sort(all.begin(), all.end(), cmp);
for(int i=0; i<all.size(); i++)
{
if(i == 0) all[i].rank = 1;
else
{
if(all[i].grade[0] == all[i-1].grade[0]) all[i].rank = all[i-1].rank;
else all[i].rank = i+1;
}
printf("%d %05d", all[i].rank, all[i].id);
for(int j=0; j<=K; j++)
{
if(all[i].grade[j] >= 0) printf(" %d", all[i].grade[j]);
else printf(" -");
}
if(i != all.size()-1)
printf("\n");
}
return 0;
}