奥运会排序问题

学校oj的题,这道题独立写出来了,还是很开心的,题目有点难理解。

/*
题目描述
按要求,给国家进行排名。 
输入
有多组数据。
第一行给出国家数N,要求排名的国家数M,国家号从0到N-1。
第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万)。
接下来一行给出M个国家号。 
输出
排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例 
对每个国家给出最佳排名排名方式 和 最终排名
格式为: 排名:排名方式
如果有相同的最终排名,则输出排名方式最小的那种排名,对于排名方式,金牌总数 < 奖牌总数 < 金牌人口比例 < 奖牌人口比例 
如果有并列排名的情况,即如果出现金牌总数为 100,90,90,80.则排名为1,2,2,4.
每组数据后加一个空行。 
*/
//这个题目有点难理解
//1.按照各个类别从大到小排序排序
//2.找到每个国家的最佳排名方式,相同排名方式取最小的那个。

/*
代码总结:
1.排序sort,改变原始数据是一个可怕的事情!
2.代码排版
*/
#include <vector>
#include <iostream>
#include <algorithm>

using std::vector;
using std::count;
using std::cin;


//定义一个类,接受输入的数据
class Model {
private:
    int key;//关键码,表示国家号
    int gold;//金牌数量
    int medal;//普通奖牌数量
    int populations;//人口总量
    
    
public:
    Model(int m_key, int m_gold, int m_medal, int m_popu ):key(m_key),gold(m_gold),medal(m_medal),populations(m_popu)
    {

    }
    int get_key() { return key; }
    int get_gold() { return gold; }//金牌比率
    int get_medal() { return medal; }//金牌比率
    void set_key(int m_key) {key = m_key;}
    double gold_rate() { return gold / populations; }//金牌比率
    double medal_rate() { return medal / populations; }//奖牌比率
};


//重写compare函数,进行排序
/*
按照金牌数量排序
按照奖牌数量排序
按照金牌比率排序
按照奖牌比率排序
*/
// a,b类型为容器里面的元素的类型
bool sort_gold(Model * a,Model * b) {
    return a->get_gold() > b->get_gold();
}

bool sort_medal(Model * a, Model * b) {
    return a->get_medal() > b->get_medal();
}

bool sort_gold_rate(Model * a, Model  * b){
    return a->gold_rate() > b->gold_rate();
    }

bool sort_medal_rate(Model * a, Model  * b){
    return a->medal_rate() > b->medal_rate();
    }


//内存管理处理,销毁myvec中的对象
void destory(vector<Model*>& myvec) {
    int i = 0;
    for (;i++;i < myvec.size()) {
        delete myvec[i];
    }
}


int main() {
    int country_nums, sort_nums;
    //输入国家数目和需要排序的国家数目
    while (cin >> country_nums >> sort_nums) {

        //对象指针数组
        vector<Model*> myvec(country_nums);
        int i = 0;
        int gold, medal, populations;
        for (; i < country_nums; i++) {
            cin >> gold >> medal >> populations;
            Model* mod = new Model(i, gold, medal, populations);
            myvec[i] = mod;
        }

        int j = 0;
        //需要排序的国家号,用country_index存储
        vector<int> country_index(sort_nums);
        for (; j < sort_nums; j++) {
            cin >> country_index[j];
        }
        vector<Model*> temp(myvec.begin(), myvec.end());//myvec的副本,对于sort()函数来说,会改变myvec,下次排序时,应该新建一个副本进行操作,而不是直接修改原始数据
        vector<int> goldvec(sort_nums);
        vector<int> medalvec(sort_nums);
        vector<int> gold_ratevec(sort_nums);
        vector<int> medal_ratevec(sort_nums);
        
        //针对金牌数排名,并将金牌数加到数组goldvec中
        std::sort(temp.begin(), temp.end(), sort_gold);
        for (int i = 0; i < sort_nums; i++) {
            goldvec[i] = temp[country_index[i]]->get_gold();
        }

        //针对奖牌数排名,并将奖牌数加到数组medalvec中
        std::sort(temp.begin(), temp.end(), sort_medal);
        for (int i = 0; i < sort_nums; i++) {
            medalvec[i] = temp[country_index[i]]->get_medal();
        }

        //针对金牌率排名,并将金牌率加到数组gold_ratevec中
        std::sort(temp.begin(), temp.end(), sort_gold_rate);
        for (int i = 0; i < sort_nums; i++) {
            gold_ratevec[i] = temp[country_index[i]]->gold_rate();
        }

        //针对奖牌率排名,并将奖牌率加到medal_ratevec中
        std::sort(temp.begin(), temp.end(), sort_medal_rate);
        for (int i = 0; i < sort_nums; i++) {
            medal_ratevec[i] = temp[country_index[i]]->medal_rate();
        }

        //开始输出排名方式
        int best_rank;
        int rank_method;
        for (int i = 0; i < sort_nums;i++) {
            //1.查找金牌数
            best_rank = std::find(goldvec.begin(), goldvec.end(), myvec[country_index[i]]->get_gold()) - goldvec.begin() + 1;
            rank_method = 1;
            //2.查找奖牌数
            int medal_rank = std::find(medalvec.begin(), medalvec.end(), myvec[country_index[i]]->get_medal()) - medalvec.begin() + 1;
            if (medal_rank < best_rank) { best_rank = medal_rank;rank_method = 2; }
            //3.查找金牌比率
            int gold_rate_rank = std::find(gold_ratevec.begin(), gold_ratevec.end(), myvec[country_index[i]]->gold_rate()) - gold_ratevec.begin() + 1;
            if (gold_rate_rank < best_rank) { best_rank = gold_rate_rank;rank_method = 3; }
            //4查找奖牌比率
            int medal_rate_rank = std::find(medal_ratevec.begin(), medal_ratevec.end(), myvec[country_index[i]]->medal_rate()) - medal_ratevec.begin() + 1;
            if (medal_rate_rank < best_rank) { best_rank = medal_rank;rank_method = 4; }
            std::cout << best_rank << ":" << rank_method << "\n";
        }
        std::cout << "\n";
        //注意vec里的指针指向堆区,需要手动清空
        destory(myvec);
    }
}

 

posted @ 2020-06-10 22:01  FizzPu  阅读(276)  评论(0编辑  收藏  举报