华为OJ-奥运会排行榜C++
华为OJ-奥运会排行榜C++
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
【华为OD机试真题】可以转到CSDN相关专栏订阅学习:https://blog.csdn.net/weixin_45541762/article/details/129903356
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】