奥运排序问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1054    Accepted Submission(s): 201

       这一题很简单,模拟就可以了,但是处理起来可能比较麻烦。我错了一次,原因是没有看清题意,我一开始以为所有的国家都参加排名,后来才看到是要求的国家才要求排名,这是一个教训!

     代码如下:(写的比较乱)

 

#include<stdio.h>
#include
<stdlib.h>
struct node
{
int gm,me,id;
double gp,mp;

}c[
1000],d[1000];
int cmp1(const void *a,const void *b)
{
return (*(node *)a).gm<(*(node *)b).gm?1:-1;
};
int cmp2(const void *a,const void *b)
{
return (*(node *)a).me<(*(node *)b).me?1:-1;
};
int cmp3(const void *a,const void *b)
{
return (*(node *)a).gp<(*(node *)b).gp?1:-1;
};
int cmp4(const void *a,const void *b)
{
return (*(node *)a).mp<(*(node *)b).mp?1:-1;
};

int n,A[1000][5],t[1000],m;
void paixu(int x)
{
int term=1,i;
A[d[
0].id][x]=term;
switch(x)
{
case 1:
for(i=1;i<m;i++)
{
if(d[i-1].gm==d[i].gm)
A[d[i].id][x]
=term;
else
{
A[d[i].id][x]
=i+1;
term
=i+1;
}
}
break;
case 2:
for(i=1;i<m;i++)
{
if(d[i-1].me==d[i].me)
A[d[i].id][x]
=term;
else
{
A[d[i].id][x]
=i+1;
term
=i+1;
}
}
break;
case 3:
for(i=1;i<m;i++)
{
if(d[i-1].gp-d[i].gp<0.000000000001)
A[d[i].id][x]
=term;
else
{
A[d[i].id][x]
=i+1;
term
=i+1;
}
}
break;
case 4:
for(i=1;i<m;i++)
{
if(d[i-1].mp-d[i].mp<0.000000000001)
A[d[i].id][x]
=term;
else
{
A[d[i].id][x]
=i+1;
term
=i+1;
}
}
break;

}
}
void put(int x)
{
int term,i,min=0xfffffff;
for(i=1;i<=4;i++)
{
if(A[x][i]<min)
{
min
=A[x][i];
term
=i;
}
}
printf(
"%d:%d\n",min,term);
}
int main()
{
int i,p,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
j
=0;
for(i=0;i<n;i++)
{
scanf(
"%d%d%d",&c[i].gm,&c[i].me,&p);
c[i].gp
=c[i].gm*1.0/p;
c[i].mp
=c[i].me*1.0/p;
c[i].id
=i;
}
for(i=1;i<=m;i++)
{
scanf(
"%d",&t[i]);
d[j
++]=c[t[i]];
}
qsort(d,m,
sizeof(d[0]),cmp1);
paixu(
1);
qsort(d,m,
sizeof(d[0]),cmp2);
paixu(
2);
qsort(d,m,
sizeof(d[0]),cmp3);
paixu(
3);
qsort(d,m,
sizeof(d[0]),cmp4);
paixu(
4);
for(i=1;i<=m;i++)
put(t[i]);
printf(
"\n");
}
return 0;
}