有趣的“打擂台算法”

什么是"打擂台"?

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

在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;
}

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

第一个上台当擂主,

后面一个个来比武,

谁更厉害谁留下,

最后剩下是霸主!

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

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

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

相关推荐
禹凕11 分钟前
滑动窗口算法实战指南
python·算法
DisonTangor17 分钟前
【腾讯混元雪耻归来】 Hy4 preview:770B 参数 MoE 旗舰模型,1M 上下文全面开源
人工智能·算法·开源·aigc·腾讯云·腾讯云ai代码助手
明月_清风1 小时前
从二叉树到 B+ 树:一文搞懂工程中「树」的演化之道
数据结构·算法·go
渡我白衣2 小时前
并查集:基础认识与模拟实现
android·java·javascript·数据结构·c++·算法·并查集
如意猴2 小时前
【C++】001--C++入门(1)
开发语言·c++
hetao17338372 小时前
2026-09-01~09-04 hetao1733837 的刷题记录
c++·算法
Evand J2 小时前
【MATLAB例程,图像滤波5】 反谐波均值滑动窗口滤波(CHMF)图像降噪与质量评价,附代码下载链接
图像处理·算法·计算机视觉·matlab·均值算法·滑动窗口滤波·均值滑动
血小板要健康2 小时前
链表 阶段算法总结
java·数据结构·笔记·算法·leetcode·链表
a187927218313 小时前
【算法】回溯算法(三):三记重锤与 N 皇后——记忆化、状态设计与三层漏斗
算法·leetcode·go·剪枝·回溯·n皇后·算法讲解
HugoStudio_SWAN4 小时前
洛谷 P1420 / P1179 / B4262 最长连号、数字统计与词频统计——统计的三种面孔
c++·学习·程序人生·算法