学校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); } }
原文:https://www.cnblogs.com/jielearscoding/p/13089364.html