华为OJ-奥运会排行榜

华为OJ-奥运会排行榜

题目描述:

1、首先gold medal数量多的排在前面;
2、其次silver medal数量多的排在前面;
3、然后bronze medal数量多的排在前面;
4、若以上三个条件仍无法区分名次,则以国家名称的字典序排定
我们假设国家名称不超过20个字符、各种奖牌数不超过100,且大于等于0.

输入:

第一行输入一个整数N(0<N<21),代表国家数量;
然后接下来的N,每行包含一个字符串Namei表示每个国家的名称,和三个整数Gi、Si、Bi表示每个获得的gold medal、silver medal、bronze medal的数量,以空格隔开,如(China 51 20 21)

输出:

输出奖牌榜的依次顺序,只输出国家名称,各占一行。
主要是考察sort的用法

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using std::cin;
using std::cout;
using std::endl;
struct Rank
{
    std::string country_name;
    unsigned gold;
    unsigned silver;
    unsigned brozen;
};
bool operator<(const Rank& r1, const Rank& r2);
void showRank(const Rank& rr);


int main()
{
    std::vector<Rank> ranks;
    unsigned n;
    cin >> n;
    Rank rr;
    for (unsigned i = 0; i < n; ++i)
    {
        cin >> rr.country_name;
        cin >> rr.gold >> rr.silver >> rr.brozen;
        ranks.push_back(rr);
    }
    sort(ranks.begin(), ranks.end());
    for_each(ranks.rbegin(), ranks.rend(), showRank);
    return 0;
}
bool operator<(const Rank& r1, const Rank& r2)
{
    if (r1.gold < r2.gold)
        return true;
    else if (r1.gold == r2.gold && r1.silver < r2.silver)
        return true;
    else if (r1.gold == r2.gold && r1.silver == r2.silver && r1.brozen < r2.brozen)
        return true;
    else if (r1.gold == r2.gold && r1.silver == r2.silver &&  r1.brozen == r2.brozen
             && r1.country_name > r2.country_name)//按字母顺序的逆序排序
        return true;
    else
        return false;
}

void showRank(const Rank& rr)
{
    cout << rr.country_name << endl;
}

当然也可以修改成如下的代码:

    sort(ranks.begin(), ranks.end());
    for_each(ranks.begin(), ranks.end(), showRank);//注意这里修改成begin(),end()
    return 0;
}
bool operator<(const Rank& r1, const Rank& r2)
{
    if (r1.gold > r2.gold)//注意,原来从这里起及随后的两个小于号都改成了大于号,这个可以是大于也可
    //是小于号,operator<的小于号作用对象为结构对象,而这里的大于及小于号作用对象是结构成员,所以没有联系
        return true;
    else if (r1.gold == r2.gold && r1.silver > r2.silver)
        return true;
    else if (r1.gold == r2.gold && r1.silver == r2.silver && r1.brozen > r2.brozen)
        return true;
    else if (r1.gold == r2.gold && r1.silver == r2.silver &&  r1.brozen == r2.brozen
             && r1.country_name < r2.country_name)//按字母顺序排序
        return true;
    else
        return false;
}

增加python代码:

while True:
    try:
        n = int(input())
        matrix = []
        for i in range(n):
            s = input().split()
            matrix.append(s)
        matrix.sort(key = lambda x :(-int(x[1]),-int(x[2]),-int(x[3]),x[0]))#这才是正确的方法!!!
        for item in matrix:
            print(item[0])
    except:
        break
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笑着的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值