od面试手撕代码:2012伦敦奥运会即将到来,大家都非常关注奖牌榜的情况,现在我们假设奖牌榜的排名规则如下:

该博客介绍了一种用于排序2012伦敦奥运会奖牌榜的算法,根据金牌、银牌、铜牌数量以及国家名称字典序进行排序。算法实现了一个结构体`Rank`,包含国家名称和三种奖牌数,并定义了小于操作符重载以满足排序规则。通过示例展示了输入和输出格式,以及排序结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述
2012伦敦奥运会即将到来,大家都非常关注奖牌榜的情况,现在我们假设奖牌榜的排名规则如下:
1、首先gold medal数量多的排在前面;
2、其次silver medal数量多的排在前面;
3、然后bronze medal数量多的排在前面;
4、若以上三个条件仍无法区分名次,则以国家名称的字典序排定。
我们假设国家名称不超过20个字符、各种奖牌数不超过100,且大于等于0。
解答要求时间限制:1000ms, 内存限制:100MB

输入
第一行输入一个整数N(0<N<21),代表国家数量;
然后接下来的N行,每行包含一个字符串Namei表示每个国家的名称,和三个整数Gi、Si、Bi表示每个获得的gold medal、silver medal、bronze medal的数量,以空格隔开,如(China 51 20 21),具体见样例输入。
输出
输出奖牌榜的依次顺序,只输出国家名称,各占一行,具体见样例输出。
 
样例
输入样例 1 
5
China 32 28 34
England 12 34 22
France 23 33 2
Japan 12 34 25
Rusia 23 43 0
输出样例 1
China

### 华为OD面试C++代码常见题目及解答 #### 1. **递增字符串** 此问题是华为OD机试中的高频题之一,目标是实现一个函数来判断给定的字符串是否可以经过若干次操作变为严格递增序列。以下是基于C++的解决方案: ```cpp #include <iostream> #include <string> using namespace std; bool canBeIncreasing(string s) { int count = 0; for (int i = 1; i < s.size(); ++i){ if(s[i] <= s[i - 1]){ count++; if(count > 1){ return false; } if(i >= 2 && s[i] <= s[i - 2]){ s[i] = s[i - 1]; }else{ s[i - 1] = s[i] - 1; } } } return true; } int main(){ string inputString = "abc"; cout << (canBeIncreasing(inputString) ? "Yes" : "No") << endl; } ``` 上述代码实现了`canBeIncreasing`函数[^2],该函数用于检测输入字符串能否通过一次删除字符的操作转换成严格递增字符串。 --- #### 2. **分发糖果问题** 这是一个经典的动态规划问题,在华为OD面试中也经常被提及。其核心在于分配最少数量的糖果使得满足特定条件。下面是C++版本的解决方法: ```cpp #include <vector> #include <algorithm> using namespace std; int distributeCandies(vector<int>& ratings) { int n = ratings.size(); vector<int> candies(n, 1); // 左到右遍历 for(int i=1;i<n;i++) { if(ratings[i]>ratings[i-1]) { candies[i]=candies[i-1]+1; } } // 右到左遍历 for(int i=n-2;i>=0;i--) { if(ratings[i]>ratings[i+1]) { candies[i]=max(candies[i],candies[i+1]+1); } } return accumulate(candies.begin(), candies.end(), 0); } // 测试用例 void testDistributeCandies() { vector<int> ratings = {1, 0, 2}; cout << "Total Candies Needed: " << distributeCandies(ratings) << endl; } int main(){ testDistributeCandies(); } ``` 这段代码展示了如何利用两次扫描完成最小糖果数目的计算过程[^3]。 --- #### 3. **背包DP问题** 背包问题是算法设计领域的重要经典问题之一,也是华为OD考试的重点考察对象。下面是一个简单的0/1背包问题实例及其对应的C++实现方案: ```cpp #include <bits/stdc++.h> using namespace std; const int MAX_W = 1e3 + 5; int dp[MAX_W]; int knapsackProblem(int W, vector<pair<int,int>> items){ memset(dp, 0, sizeof(dp)); for(auto &[w,v]:items){ for(int j=W;j>=w;j--){ dp[j] = max(dp[j], dp[j-w]+v); } } return dp[W]; } // 测试用例 void testKnapsackProblem(){ int capacity = 10; vector<pair<int,int>> items = {{2,6},{2,3},{6,5},{5,4},{4,6}}; cout << "Max Value in Knapsack: " << knapsackProblem(capacity, items) << endl; } int main(){ testKnapsackProblem(); } ``` 这里提供了标准的动态规划解法来处理0/1背包问题。 --- #### 4. **最长公共子序列(LCS)** LCS也是一个常见的华为OD面试考点,它涉及到两个字符串之间的匹配关系。以下提供了一个高效的C++实现方式: ```cpp #include <vector> #include <string> using namespace std; int longestCommonSubsequence(const string& text1, const string& text2) { int m = text1.length(), n = text2.length(); vector<vector<int>> dp(m + 1, vector<int>(n + 1)); for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ if(text1[i-1]==text2[j-1]){ dp[i][j] = dp[i-1][j-1] + 1; } else{ dp[i][j] = max(dp[i-1][j], dp[i][j-1]); } } } return dp[m][n]; } // 测试用例 void testLongestCommonSubsequence(){ string str1="AGGTAB",str2="GXTXAYB"; cout<<"Length of LCS is "<<longestCommonSubsequence(str1,str2)<<endl; } int main(){ testLongestCommonSubsequence(); } ``` 以上程序定义并测试了寻找两串之间最大长度公共子序列的功能[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一剑破天门

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

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

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

打赏作者

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

抵扣说明:

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

余额充值