什么是"打擂台"?
小朋友们,你们看过武林大会吗?很多武林高手站在台下,一个接一个地上台挑战。台上站着一个人,谁赢了谁就留在台上,继续接受下一个人的挑战。最后留在台上的,就是最厉害的"武林盟主"!
在C++编程中,有一种找"最厉害"数字的方法,和打擂台一模一样,我们叫它打擂台算法。
打擂台算法的规则
想象一下:
-
先有一个人站上台(比如第一个数字)
-
第二个数字上来挑战,如果比台上的大(或者小),就换人
-
第三个、第四个......所有数字都挑战一遍
-
最后台上的人就是最大的(或最小的)
代码怎么写?
我们来找找一组数字中最大的那个:
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!
生活中有哪些"打擂台"?
-
比身高:体育课排队时,老师找出最高的同学
-
考试最高分:老师批卷子时,不断记下当前最高分
-
比跳远:体育老师记录最远的一次成绩
真题解析
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;
}
最后我们来记住打擂台的口诀:
第一个上台当擂主,
后面一个个来比武,
谁更厉害谁留下,
最后剩下是霸主!
打擂台算法其实很简单,就是一个一个比较,保留最厉害的那个。下次找最大最小值,就用这个方法吧!
本文为学漄乐码堂主撰写。如果您想要学到真正的知识,而不只是应试的技巧,欢迎留言跟我联系。
(写作不易,请大家点赞、关注、收藏、转发!)