1. 算法竞赛中的三大经典问题解析
作为一名参加过多次算法竞赛的老兵,我经常遇到新手对基础题目感到困惑。今天我想分享三个经典的OJ题目(116、117、118)的解题思路和实现细节,这些都是算法竞赛中的常见题型,掌握它们能帮你快速提升编程能力。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. OJ基础116:扑克牌排序问题
2.1 问题本质与核心需求
这道题目要求我们对四组、每组13张的扑克牌按照特定规则排序。每张牌由花色和点数组成,排序规则是:先按点数从大到小排序,点数相同则按花色权重从高到低排序。
花色权重定义为:
- S(黑桃)→ 4
- H(红心)→ 3
- D(方块)→ 2
- C(梅花)→ 1
点数权重为:
- A → 14
- K → 13
- Q → 12
- J → 11
- T → 10
- 数字牌保持原值
2.2 数据结构设计与实现
我选择用结构体来存储每张牌的信息:
cpp复制struct Puke {
char color; // 花色
char crank; // 点数
string all; // 完整牌面表示
};
关键点在于自定义比较函数comparePuke,它决定了排序的规则:
cpp复制bool comparePuke(const Puke& a, const Puke& b) {
int RankA = crankToValue(a.crank);
int RankB = crankToValue(b.crank);
int ColorA = colorToValue(a.color);
int ColorB = colorToValue(b.color);
// 先比较点数
if(RankA != RankB) {
return RankA > RankB; // 降序
}
// 点数相同比较花色
return ColorA > ColorB;
}
2.3 实现细节与注意事项
- 输入处理:每组牌前有一个空行(除第一组外),这个细节容易被忽略
- 权重转换:单独实现
colorToValue和crankToValue
