题解 | #奥运排序问题#
奥运排序问题
http://www.nowcoder.com/practice/100a4376cafc439b86f5f8791fb461f3
/*对评论区大佬肆年的代码的改进,思想就是肆年的思想,没有什么不同。原代码是有问题的,只是测试用例测试不出来。原代码只适用于n=m的情况。当n!=m时,正常情况下输出结果是错误的,只不过唯一的n!=m的输入用例的输出结果也是正确的*/
#include <bits/stdc++.h>
int main()
{
int n,m;
while(cin>>n>>m)
{
int nat[n][3]; //存储金牌,奖牌,人口
for(int i=0;i<n;i++)
{
cin>>nat[i][0]>>nat[i][1]>>nat[i][2];
}
float obj[n][4]; //存储金牌,奖牌,金牌人口比,奖牌人口比
for(int i=0;i<n;i++)
{
obj[i][0]=nat[i][0];
obj[i][1]=nat[i][1];
obj[i][2]=nat[i][0]?obj[i][0]/nat[i][2]:0; //这里有小问题,比如 4 7 0和 5 8 0,当有很多NAN时,这个找不出来真实的排名
obj[i][3]=nat[i][1]?obj[i][1]/nat[i][2]:0;
}
int ranking[n][4]; //记录所有国家的排名情况,输出时+1
for(int i=0;i<n;i++)
for(int j=0;j<4;j++)
ranking[i][j]=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int x=0;x<4;x++)
if(obj[j][x]>obj[i][x])
ranking[i][x]++;
for(int i=0;i<m;i++) //输出要求的m个国家的排名
{
int temp; //存储要输出的国家号
cin>>temp;
int mi=0;
for(int j=1;j<4;j++)
if(ranking[temp][j]<ranking[temp][mi])
mi=j;
printf("%d:%d\n",ranking[temp][mi]+1,mi+1);
}
cout<<endl;
}
}