PAT 的排名列表是根据状态列表产生的,状态列表中显示了所有提交记录的分数。
现在,请你为 PAT 生成排名列表。
输入格式
第一行包含三个整数 N,K,M,分别表示总用户数量,题目数量,以及提交数量。
用户编号是从 00001 到 N 的 5 位数字。
问题编号从 1 到 K。
第二行包含 K 个整数 p1,p2,…,pK,其中 pi 表示第 i 题的满分。
接下来 M 行,每行包含一个提交信息,包括用户编号,题目编号,以及得分。
当提交无法正确编译时,得分显示 −1,否则是一个 [0,该题满分] 范围内的整数。
注意,无法编译的情况虽然显示 −1,但得分上算作 0 分。
输出格式
以下列格式输出排名列表:
rank user_id total_score s[1] … s[K]
其中,rank 是根据 total_score 计算的,所以拥有相同 total_score 的用户的 rank 也相同。
s[i] 是第 i 个问题获得的分数。
如果某个问题,用户从未提交过代码,则用 - 来表示这道题的分数。
如果某个问题,用户多次提交过代码,则取最高分为这道题的分数。
列表必须根据排名从前到后输出,对于排名相同的用户,根据满分题目的数量以降序对用户排序,如果仍有排名相同的情况,则按 ID 升序的顺序排序。
对于从未提交过任何代码,或者从未提交过任何编译通过的代码的用户,输出时不予考虑。
数据范围
1≤N≤104,
1≤K≤5,
1≤M≤105
每道题的满分为不超过 30。
输入样例:
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
输出样例:
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 -
思路都在代码中了hh…
#include <bits/stdc++.h>
using namespace std;
struct node
{
int score[6]={0};//每个题的最大分
int flag[6]={0};//每个题是否编译通过
int total=0;//总分
int putt=0;//是否输出
int cnt=0;//满分的个数
int id;
}a[10011];
int n,m,k;
int que[6];
bool cmp(node&a,node&b)
{
if(a.total!=b.total)
return a.total>b.total;
if(a.cnt!=b.cnt)
return a.cnt>b.cnt;
return a.id<b.id;
}
int main()
{
cin >> n >>k >>m;
for(int i=1;i<=n;i++)
a[i].id=i;
for(int i=1;i<=k;i++)
cin >>que[i];
for(int i=1;i<=m;i++)
{
int x,y,z;
cin >> x >>y >>z;//id,题目号,分数
if(a[x].score[y]<=z)//大于等于零也可以
{
a[x].total=a[x].total-a[x].score[y]+z;//更新总分
a[x].score[y]=z;//更新这个题的分数
a[x].flag[y] = 1;//这个题提交成功过
a[x].putt = 1;//可以输出这个人了
}
else if(z==-1)
{
a[x].flag[y] = 1;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=k;j++)
{
if(a[i].score[j]==que[j])
a[i].cnt++;
}
}
sort(a+1,a+1+n,cmp);
int cnt=0;
int num=1;
for(int i=1;i<=n;i++)
{
if(a[i].putt)
{
cnt++;
if(a[num].total!=a[i].total)
num=cnt;
printf("%d %05d %d",num,a[i].id,a[i].total);
for(int j=1;j<=k;j++)
{
if(a[i].flag[j])
printf(" %d",a[i].score[j]);
else
printf(" -");
}
cout <<endl;
}
}
return 0;
}