A1075
//A1075复习
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct node{
int id,total=0,rank,passnum=0;//passnum代表得满分题得个数
vector<int> score;
//提交过这道题就把它变为true
bool isshown=false;
};
bool cmp(node a,node b)
{
if(a.total!=b.total)
return a.total>b.total;//总分相同的人有相同的等级
else if(a.passnum!=b.passnum)
return a.passnum>b.passnum;
else
return a.id<b.id;
}
int main()
{
int n,k,m;
scanf("%d %d %d",&n,&k,&m);//n是用户总数,k是问题总数,m是提交总数
vector<int> full(k+1);
for(int i=1;i<=k;i++)
{
scanf("%d",&full[i]);//输入每个满分
}
vector<node> stu(n+1);
for(int i=1;i<=n;i++)
{
stu[i].score.resize(k+1,-1);//先把所有人的分数置为-1,通过编译器的就变成别的值了,没提交的就变成-2==0
}//resize重置
int id,problem_id,score;
for(int i=1;i<=m;i++)
{
scanf("%d %d %d",&id,&problem_id,&score);
stu[id].id=id;//
stu[id].score[problem_id]=max(score,stu[id].score[problem_id]);
//如果这道题是满分的话,满分题个数加一
//柳神聪明就完事了
if(score!=-1)
stu[id].isshown=true;//用户有一题通过编译器不论得不得0分都可以输出
//比如说序号为00006这个人,她就通过一个第四题,第四题分数是-1,就不输出它
else if(stu[id].score[problem_id]==-1)
stu[id].score[problem_id]=-2;//这样的话等于-2的就变为通过编译器但得了0分
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=k;j++)
{
if(stu[i].score[j]!=-1&&stu[i].score[j]!=-2)
stu[i].total+=stu[i].score[j];
if(stu[i].score[j]==full[j])
{
stu[i].passnum++;
}
}
}
sort(stu.begin()+1,stu.end(),cmp);//+1是因为我没有用到stu【0】
//那些从来没有提交过问题或者提交了但是是-1分的人,她们不能出现在排名里
//输出
//排名 序号 总成绩 每一道题的成绩
//第一名学生排名第一
for(int i=1;i<=n;i++)
{
stu[i].rank=i;
if(i!=1&&stu[i].total==stu[i-1].total)
{
stu[i].rank=stu[i-1].rank;
}
}
//如果一个人从来没有提交过这道问题输出 —
//如果提交过这个问题但是得分是-1,输出 0
for(int i=1;i<=n;i++)
{
if(stu[i].isshown==true)
{
printf("%d %05d %d",stu[i].rank,stu[i].id,stu[i].total);
for(int j=1;j<=k;j++)
{
if(stu[i].score[j]!=-1&&stu[i].score[j]!=-2)
printf(" %d",stu[i].score[j]);
else if(stu[i].score[j]==-1)
printf(" -");
else
printf(" 0");
}
printf("\n");
}
}
return 0;
}