版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Nightmare_ak/article/details/84346415
要求:
1.总分相同的排名相同
2.总分高的排前
3.A题数多的排前
4.id字典序小的排前
5.题目未通过编译或未提交的人不计
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<string>
using namespace std;
const int N=1e5+5;
struct People
{
int score[6],sum,perf;
char id[10];
People(){for(int i=0;i<6;i++) score[i]=-2;}
bool operator<(const People&p)const
{
if(sum!=p.sum) return sum>p.sum;
if(perf!=p.perf) return perf>p.perf;
return strcmp(id,p.id)<0;
}
}pe[N],newpe[N];
int p[10];
map<string,int> mp;
int main()
{
int n,k,m;
scanf("%d%d%d",&n,&k,&m);
for(int i=1;i<=k;i++)
scanf("%d",p+i);
int res=0;
while(m--)
{
int pid,psc;
char uid[10];
scanf("%s",uid);
if(!mp.count(uid))
{
mp[uid]=++res;
strcpy(pe[mp[uid]].id,uid);
}
scanf("%d%d",&pid,&psc);
if(pe[mp[uid]].score[pid]<psc) pe[mp[uid]].score[pid]=psc;
}
int cnt=0;
for(int i=1;i<=res;i++)
{
int sum=0,perf=0,f=0;
for(int j=1;j<=k;j++)
if(pe[i].score[j]>=0)
{
f=1;
sum+=pe[i].score[j];
if(pe[i].score[j]==p[j])
perf++;
}
if(f)
{
newpe[cnt]=pe[i];
newpe[cnt].sum=sum;
newpe[cnt].perf=perf;
cnt++;
}
}
sort(newpe,newpe+cnt);
int rk=0;
for(int i=0;i<cnt;i++)
{
if(i==0||newpe[i].sum!=newpe[i-1].sum) rk=i+1;
printf("%d %s %d",rk,newpe[i].id,newpe[i].sum);
for(int j=1;j<=k;j++)
{
if(newpe[i].score[j]==-2) printf(" -");
else printf(" %d",max(0,newpe[i].score[j]));
}
printf("\n");
}
return 0;
}