有趣的“打擂台算法”

什么是"打擂台"?

小朋友们,你们看过武林大会吗?很多武林高手站在台下,一个接一个地上台挑战。台上站着一个人,谁赢了谁就留在台上,继续接受下一个人的挑战。最后留在台上的,就是最厉害的"武林盟主"!

在C++编程中,有一种找"最厉害"数字的方法,和打擂台一模一样,我们叫它打擂台算法。

打擂台算法的规则

想象一下:

  1. 先有一个人站上台(比如第一个数字)

  2. 第二个数字上来挑战,如果比台上的大(或者小),就换人

  3. 第三个、第四个......所有数字都挑战一遍

  4. 最后台上的人就是最大的(或最小的)

代码怎么写?

我们来找找一组数字中最大的那个:

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    //武林高手们的"功力值"
    int numbers[] = {56, 89, 23, 77, 95, 42, 68};
    int total = 7;  //一共7个人   

    // 第一个人先上台
    int champion = numbers[0];   

    // 剩下的6个人轮流挑战
    for(int i = 1; i < total; i++) {
        // 如果有人比台上的冠军更厉害
        if(numbers[i] > champion) {
            champion = numbers[i];                  //换人!
            cout << "第" << i+1 << "号挑战成功!现在是" << champion << endl;
        } else {
            cout << "第" << i+1 << "号挑战失败~ 台上还是" << champion << endl;
        }
    }

    cout << "冠军是:" << champion << "!" << endl;
    return 0;
}

运行结果:

第2号挑战成功!现在是89

第3号挑战失败~ 台上还是89

第4号挑战失败~ 台上还是89

第5号挑战成功!现在是95

第6号挑战失败~ 台上还是95

第7号挑战失败~ 台上还是95

冠军是:95!

生活中有哪些"打擂台"?

  1. 比身高:体育课排队时,老师找出最高的同学

  2. 考试最高分:老师批卷子时,不断记下当前最高分

  3. 比跳远:体育老师记录最远的一次成绩

真题解析

2026年3月C++ 1级的第一道编程题用到的就是打擂台算法。但这道题的难点在于,它的比较条件比较复杂,有两个条件:

(1)挑战者与Alice的身高差小于擂主与Alice的身高差

(2)挑战者与Alice的身高差等于擂主与Alice的身高差,并且挑战者的身高矮于擂主的身高

两个条件是或者的关系。身高差必须是非负数。

这个逻辑虽然复杂,但是大家在一级时都学过公历闰年的判断规则,公历闰年的判断规则也是两个条件。

这里贴出参考代码:

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
       int H1, H2, H3, H4;
       cin >> H1 >> H2 >> H3 >> H4;      

       int ans = H2;                         //先让第二个人做擂主
       int mnd = H1 - H2;                    //计算第二个人与Alice的身高差
       if (mnd < 0)                          //如果差值是负数,变成正数
              mnd = -mnd;

       int d = H1 - H3;                      //计算第三个人与Alice的身高差
       if (d < 0) d = -d;                    //如果是负数,变成正数
       if (d < mnd || (d == mnd && H3 < ans)) {        //打擂台
              ans = H3;                      //如果第三个人赢了,擂主就变成第三个人
              mnd = d;                       //身高差也要变成新的值
       }
    
       d = H1 - H4;                          //计算第四个人与Alice的身高差
       if (d < 0) d = -d;                    //如果是负数,变成正数
       if (d < mnd || (d == mnd && H4 < ans)) {        //打擂台
              ans = H4;                      //如果第四个人赢了,擂主就变成第四个人
              mnd = d;                       //这行可以省略,因为最后一个人了
       }      

       cout << ans << endl;
       return 0;
}

最后我们来记住打擂台的口诀:

第一个上台当擂主,

后面一个个来比武,

谁更厉害谁留下,

最后剩下是霸主!

打擂台算法其实很简单,就是一个一个比较,保留最厉害的那个。下次找最大最小值,就用这个方法吧!

本文为学漄乐码堂主撰写。如果您想要学到真正的知识,而不只是应试的技巧,欢迎留言跟我联系。

(写作不易,请大家点赞、关注、收藏、转发!)

相关推荐
the3clipse23 分钟前
H.265熵编码核心:CABAC自适应二进制算术编码详解——如何将语法元素高效压缩为比特流
人工智能·算法·视频编码·h.265·hevc·cabac·cavlc
CQU_JIAKE25 分钟前
10.4【A】
算法
Godspeed Zhao42 分钟前
现代智能雷达技术19——算法(5)
算法
(Charon)43 分钟前
【C++面试】RAII到底是什么:从资源管理理解C++对象生命周期
c++·算法·面试
无名猿1 小时前
成员初始化列表与初始化顺序陷阱:按声明顺序,不是书写顺序
c++·现代c++·语法基础
Omics Pro1 小时前
之江实验室NAR|虚拟细胞3阶段训练范式
数据库·人工智能·算法·机器学习·自然语言处理
Tisfy1 小时前
LeetCode 0678.有效的括号字符串:O(n)+O(1)一次遍历
算法·leetcode·字符串·题解·贪心·括号匹配
91刘仁德1 小时前
传输层协议深度拆解:端口寻址、UDP 报文与 TCP 可靠性机制全解析
linux·网络·c++·网络协议·tcp/ip·udp·c
小O的算法实验室1 小时前
IEEE TEVC,学习辅助的搜索路径重构进化算法
学习·算法·重构
Liuchang09111 小时前
洛谷 P2670 [NOIP 2015 普及组] 扫雷游戏
c++·算法·游戏