有趣的“打擂台算法”

什么是"打擂台"?

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

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

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

第一个上台当擂主,

后面一个个来比武,

谁更厉害谁留下,

最后剩下是霸主!

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

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

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

相关推荐
会编程的小孩2 小时前
C++ qt的安装
c++
企业数字化笔记4 小时前
视频人体姿态怎么做三维可视化?2D关键点、深度局限与技术选型
人工智能·算法·音视频
?abc!5 小时前
(数组)581. 最短无序连续子数组
数据结构·算法·leetcode
小成202303202657 小时前
C++~07补充
开发语言·c++
小郎君6587 小时前
MPTT树复选框的半选状态:一棵百万节点树从递归到计数器,再到区间覆盖
算法
酌沧7 小时前
MemT让记忆成为模型内生能力
jvm·人工智能·算法
hold?fish:palm8 小时前
40 二叉树的直径
c++·leetcode
Shimeri8 小时前
越卷越像:我用遗传算法做了个"内卷"实验
算法·three.js·数据可视化·遗传算法·进化算法
解决小子8 小时前
【虚幻引擎】【C++】【GAS框架】构建角色基类、属性集、数值钳制
c++·笔记·游戏引擎·虚幻·gas·能力系统
Evand J9 小时前
【PMSM例程1】永磁同步电机(PMSM)转速与转子电角度观测算法|基于扩展卡尔曼滤波(EKF)的传感器状态估计与误差。附下载链接
算法·电机·1024程序员节·卡尔曼滤波