奥运排序问题
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;
}
#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;
}