#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
struct rank
{
char name[12];
int sol, tot, g, p[7], ind;//sol 解决题数 tot总时间
};
rank r[25];
int comp(const void *c, const void *d)
{
rank *a = (rank *)c; rank *b = (rank *)d;
if(a.sol>b.sol)return 1;
else if(a.sol<b.sol)return -1;
else
{
if(a.tot<b.tot)return -1;
else if(a.tot>b.tot) return 1;
else
{
if(a.g>b.g) return 1;
else if(a.g<b.g)return -1;
else
{
return strcmp(a.name,b.name);
}
}
}
}
int main()
{
int n,cnt=1;
scanf("%d",&n);
if(!n) break;
for(int i=0;i<n;i++)
{
r[i].sol=0;r[i].tot=0;r[i].g=0;
double t=0;
scanf("%s",r[i].name);
for(int i=0;i<7;i++)
{
scanf("%d",&r[i].p[j]);
if(r[i].p[j]>0)
{
r[i].sol++;r[i].tot+=r[i].p[j];
t += log((double)ranks[i].p[j]);
}
}
if(r[i].sol)
{
r[i].g=(int)(exp(t/ranks[i].sol) + 0.5);
}
}
qsort(r,n,sizeof(rank),comp);
printf("CONTEST %d\n", cnt);
cnt++;
for(int s= 0; s < n; s++)
{
if(s < 9)
{
printf("0");
}
if(s > 0 && ranks[s].sol == ranks[s-1].sol && ranks[s].tot == ranks[s-1].tot && ranks[s].g == ranks[s-1].g)
{
ranks[s].ind = ranks[s-1].ind;
}
else
{
ranks[s].ind = s + 1;
}
printf("%d %-10s %d %4d %3d %3d %3d %3d %3d %3d %3d %3d\n", ranks[s].ind, ranks[s].name, ranks[s].sol, ranks[s].tot, ranks[s].g,
ranks[s].p[0], ranks[s].p[1], ranks[s].p[2], ranks[s].p[3], ranks[s].p[4], ranks[s].p[5], ranks[s].p[6]);
}
}
return 0;
}
总结:
1.本题参赛队员的数据过多,建议采用结构体数据类型;
2.采用qsort函数进行快速排序,其中的comp函数应当仔细研究;
3.输出格式应该十分小心,一失足成千古恨啊~。
原文:http://www.cnblogs.com/khbcsu/p/3852696.html