有点恶心的排序,不能改变原来的下表,得用四个数组分别存做题数为4,2,3,1的下表,并且在求排名是,要对下班进行排序(还好数据小可以用冒泡)。。
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
struct node
{
int p,t,mark;
}A[101];
int cmp(const void*a,const void*b)
{
return *((int*)a)-*((int*)b);
}
void fun(int *a,int n)
{
int i,j,t;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(A[a[j]].t<A[a[i]].t)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
for(i=0;i<n;i++)
A[a[i]].mark=i+1;
}
int main()
{
int i;
//数组ai存做题数为i的学生的下标,li为长度
int a1[101],l1;
int a2[101],l2;
int a3[101],l3;
int a4[101],l4;
int n,h,m,s,p;
while(scanf("%d",&n),n>0)
{
l1=l2=l3=l4=0;
for(i=0;i<n;i++)
{
scanf("%d %d:%d:%d",&p,&h,&m,&s);
A[i].p=p;
A[i].t=h*3600+m*60+s;
if(p==4)a4[l4++]=i;
if(p==3)a3[l3++]=i;
if(p==2)a2[l2++]=i;
if(p==1)a1[l1++]=i;
}
fun(a1,l1);
fun(a2,l2);
fun(a3,l3);
fun(a4,l4);
for(i=0;i<n;i++)
{
if(A[i].p==5)printf("100\n");
else if(A[i].p==0)printf("50\n");
else if(A[i].p==4)
{
if(A[i].mark<=l4/2)printf("95\n");
else printf("90\n");
}
else if(A[i].p==3)
{
if(A[i].mark<=l3/2)printf("85\n");
else printf("80\n");
}
else if(A[i].p==2)
{
if(A[i].mark<=l2/2)printf("75\n");
else printf("70\n");
}
else if(A[i].p==1)
{
if(A[i].mark<=l1/2)printf("65\n");
else printf("60\n");
}
}
printf("\n");
}
return 0;
}