有趣的“打擂台算法”

什么是"打擂台"?

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

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

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

第一个上台当擂主,

后面一个个来比武,

谁更厉害谁留下,

最后剩下是霸主!

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

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

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

相关推荐
Tutankaaa2 小时前
知识竞赛题库设计全攻略
人工智能·算法
云栖梦泽2 小时前
Linux内核与驱动:14.SPI子系统
linux·运维·服务器·c++
WolfGang0073212 小时前
代码随想录算法训练营 Day50 | 图论 part08
数据结构·算法·图论
Gary Studio2 小时前
安卓HAL C++基础-智能指针
开发语言·c++
还是阿落呀2 小时前
基本控制结构2
c++
多思考少编码3 小时前
PAT甲级真题1001 - 1005题详细题解(C++)(个人题解)
c++·python·最短路·pat·算法竞赛
极客智造4 小时前
C++ 标准 IO 流全详解:cin /cout/get /getline 原理、用法、区别与避坑
c++·io
charlie1145141914 小时前
嵌入式C++工程实践第20篇:GPIO 输入模式内部电路 —— 芯片是如何“听“到外部信号的
开发语言·c++·stm32·单片机
aini_lovee4 小时前
多目标粒子群优化(MOPSO)双适应度函数MATLAB实现
人工智能·算法·matlab