题解 | #奥运排序问题#

奥运排序问题

http://www.nowcoder.com/practice/100a4376cafc439b86f5f8791fb461f3

/*对评论区大佬肆年的代码的改进,思想就是肆年的思想,没有什么不同。原代码是有问题的,只是测试用例测试不出来。原代码只适用于n=m的情况。当n!=m时,正常情况下输出结果是错误的,只不过唯一的n!=m的输入用例的输出结果也是正确的*/

#include <bits/stdc++.h>

using namespace std;

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;
    }
}

全部评论

相关推荐

11-18 09:44
Java
小白也想要offer:简历别放洋屁,搞不还还放错了,当然你投外企除外,以上纯属个人观点
点赞 评论 收藏
分享
扭转乾坤_:现在企业都是学华为,一直通过丢池子里,最后捞
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-21 19:05
点赞 评论 收藏
分享
1 1 评论
分享
牛客网
牛客企业服务