思路:
简单的排序,但是注意
(1)“For those who has never submitted any solution that can pass the compiler, or has never submitted any solution, they must NOT be shown on the ranklist. ”,一道题目,没有提交记录或者提交后编译失败都视为“没做”,如果所有题目都“没做”,就忽略这个人;
(2)输出时,只要这道题目有提交,得分为0和编译失败均视为0分。
搞懂这两点就比较好做了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 100100;
int vis[maxn],m,n,k,p[10];
struct Node{
int u_id,tol,sco[10],num;
Node(){
for(int i=0;i<10;i++) sco[i]=-2;
}
}cur[maxn];
vector <Node> vc;
bool cmp(Node a,Node b)
{
if(a.tol!=b.tol) return a.tol>b.tol;
else{
if(a.num!=b.num) return a.num>b.num;
else return a.u_id<b.u_id;
}
}
int MAX(int x,int y)
{
return x>y?x:y;
}
int main(void)
{
int pos=0,i,j,x,y,z,len,fg;
memset(vis,0,sizeof(vis));
scanf("%d%d%d",&n,&k,&m);
for(i=1;i<=k;i++) scanf("%d",&p[i]);
for(i=1;i<=m;i++){
scanf("%d %d %d",&x,&y,&z);
if(vis[x]==0){
vis[x]=++pos;
cur[pos].u_id=x;
cur[pos].sco[y]=MAX(cur[pos].sco[y],z);
}
else{
len=vis[x];
cur[len].sco[y]=MAX(cur[len].sco[y],z);
}
}
for(i=1;i<=pos;i++){
cur[i].tol=0;cur[i].num=0;
for(fg=0,j=1;j<=k;j++)
if(cur[i].sco[j]>=0){
fg=1;cur[i].tol+=cur[i].sco[j];
if(cur[i].sco[j]==p[j]) cur[i].num++;
}
if(fg==1) vc.push_back(cur[i]);
}
sort(vc.begin(),vc.end(),cmp);
for(i=0,len=vc.size();i<len;i++){
if(i==0||vc[i].tol!=vc[i-1].tol) x=i+1;
printf("%d %05d %d",x,vc[i].u_id,vc[i].tol);
for(j=1;j<=k;j++)
if(vc[i].sco[j]==-2) printf(" -");
else if(vc[i].sco[j]==-1) printf(" 0");
else printf(" %d",vc[i].sco[j]);
printf("\n");
}
return 0;
}