美文网首页
奥运排序问题

奥运排序问题

作者: 步行植物 | 来源:发表于2019-06-21 08:22 被阅读0次

    问题 G: 奥运排序问题

    时间限制: 1 Sec 内存限制: 32 MB

    题目描述

    按要求,给国家进行排名。

    输入

    有多组数据。
    第一行给出国家数N,要求排名的国家数M,国家号从0到N-1。
    第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万)。
    接下来一行给出M个国家号。

    输出

    排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例
    对每个国家给出最佳排名排名方式 和 最终排名
    格式为: 排名:排名方式
    如果有相同的最终排名,则输出排名方式最小的那种排名,对于排名方式,金牌总数 < 奖牌总数 < 金牌人口比例 < 奖牌人口比例
    如果有并列排名的情况,即如果出现金牌总数为 100,90,90,80.则排名为1,2,2,4.
    每组数据后加一个空行。

    样例输入

    4 4
    4 8 1
    6 6 2
    4 8 2
    2 12 4
    0 1 2 3
    4 2
    8 10 1
    8 11 2
    8 12 3
    8 13 4
    0 3

    样例输出

    1:3
    1:1
    2:1
    1:2

    1:1
    1:1

    
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    #include<vector>
    typedef struct country {
        int id;  //输入国家的序号
        double a; //金牌数
        double b; //奖牌数
        double c; //人口
        double d; //金牌人口比
        double e; //奖牌人口比
        int rank[5]; //记录各种方式下的排名  第五个为最佳名次使用的排序方式
        int Rank; //最佳名次
    }COUN;
    //按各种方式排序
    bool cmp1(COUN c1, COUN c2)
    {
        return c1.a > c2.a;
    }
    bool cmp2(COUN c1, COUN c2)
    {
        return c1.b > c2.b;
    }
    bool cmp3(COUN c1, COUN c2)
    {
        return c1.d > c2.d;
    }
    bool cmp4(COUN c1, COUN c2)
    {
        return c1.e > c2.e;
    }
    
    //调整为输入顺序  进行输出
    bool cmp(COUN c1, COUN c2)
    {
        return c1.id < c2.id;
    }
    int main()
    {
        int m, n;
        COUN cou[1000];
        int index;
        vector<COUN>v;
        while (cin >> m >> n)
        {
            v.clear();
            for (int i = 0; i < m; i++)
            {
                cin >> cou[i].a >> cou[i].b >> cou[i].c;
                cou[i].d = cou[i].a / cou[i].c;
                cou[i].e = cou[i].b / cou[i].c;
                cou[i].id = i;
            }
            for (int j = 0; j < n; j++)
            {
                cin >> index;
                v.push_back(cou[index]);
            }
            sort(v.begin(), v.end(), cmp1);
            for (int i = 0; i < n; i++)
            {
                v[i].rank[0] = i + 1;
                if (i >= 1) {
                    if (v[i].a == v[i - 1].a)
                        v[i].rank[0] = v[i - 1].rank[0];
                }
            }
            sort(v.begin(), v.end(), cmp2);
            for (int i = 0; i < n; i++)
            {
                v[i].rank[1] = i + 1;
                if (i >= 1) {
                    if (v[i].b == v[i - 1].b)
                        v[i].rank[1] = v[i - 1].rank[1];
                }
            }
            sort(v.begin(), v.end(), cmp3);
            for (int i = 0; i < n; i++)
            {
                v[i].rank[2] = i + 1;
                if (i >= 1) {
                    if (v[i].d == v[i - 1].d)
                        v[i].rank[2] = v[i - 1].rank[2];
                }
            }
            sort(v.begin(), v.end(), cmp4);
            for (int i = 0; i < n; i++)
            {
                v[i].rank[3] = i + 1;
                if (i >= 1) {
                    if (v[i].e == v[i - 1].e)
                        v[i].rank[3] = v[i - 1].rank[3];
                }
            }
            for (int i = 0; i < n; i++)
            {
                int MIN = 99;
                for (int j = 0; j < 4; j++)
                {
                    if (v[i].rank[j] < MIN)
                    {
                        v[i].Rank = v[i].rank[j];
                        v[i].rank[4] = j + 1;
                        MIN = v[i].rank[j];
                    }
                }
            }
            sort(v.begin(), v.end(), cmp);
            for (int i = 0; i < n; i++)
            {
                cout << v[i].Rank << ":" << v[i].rank[4] << endl;
            }
            cout << endl;
        }
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:奥运排序问题

          本文链接:https://www.haomeiwen.com/subject/scjeqctx.html