1085. PAT单位排行 (25)
https://www.patest.cn/contests/pat-b-practise/1085
#include <stdio.h>
#include <stdlib.h>
typedef struct{int id_num;int sc;char unit[10];}entry;
int cmp1(const void*a,const void*b)
{
char*c=(*(entry**)a)->unit;char*d=(*(entry**)b)->unit;
while (*c==*d&&*c){c++;d++;}return *c-*d;
}
int cmp2(const void*a,const void*b)
{
entry**c=*(entry***)a,**d=*(entry***)b;
return d[0]->sc-c[0]->sc?d[0]->sc-c[0]->sc:c[0]->id_num-d[0]->id_num?
c[0]->id_num-d[0]->id_num:cmp1(c,d);
}
int main(void)
{
int n,i,j,k,sum,v,p,c1,d=0;
char c;
entry rt[100100]={0},*pr[100100]={0},**rank[100100]={0};
scanf("%d",&n);getchar();
for (i=0;i<n;i++)
{
c=getchar();
if(c=='B') rt[i].id_num=4;
else if (c=='A') rt[i].id_num=6;
else rt[i].id_num=9;
while ((c=getchar())-32);
scanf("%d",&rt[i].sc);getchar();
for(j=0;(c=getchar())-10&&c+1;j++)
{
if(c<='Z')c+='a'-'A';
rt[i].unit[j]=c;
}
pr[i]=rt+i;
}
qsort(pr,n,sizeof*pr,cmp1);
for(i=0,v=0;i<n;i=j)
{
for(j=i+1;j<n&&!cmp1(pr+i,pr+j);j++);
for (k=i,sum=0;k<j;k++)sum+=pr[k]->sc*pr[k]->id_num;
pr[i]->sc=sum/6;pr[i]->id_num=j-i;rank[v++]=pr+i;
}
qsort(rank,v,sizeof*rank,cmp2);
printf("%d",v);
for(i=0,p=200000000,c1=0;i<v;i++)
{
if (rank[i][0]->sc<p){c1+=d+1;d=0;}
else d++;
p=rank[i][0]->sc;
printf("\n%d %s %d %d",c1,rank[i][0]->unit,p,rank[i][0]->id_num);
}
return 0;
}