P5718 【深基4.例2】找最小值
一、题目理解
给出 n 个非负整数,要求找出其中的最小值并输出。
输入要求:
-
第一行:一个正整数
n(数字个数) -
第二行:
n个非负整数,用空格隔开
输出要求:
-
输出一个非负整数,即这
n个数中的最小值
数据范围:
-
n ≤ 100 -
0 ≤ a_i ≤ 1000
数据规模很小,直接遍历一遍即可,不需要排序。
二、核心思想:打擂台法
2.1 什么是打擂台法?
想象一个比武招亲的擂台赛:
-
擂台上先站着一个“擂主”(当前最小值)。
-
下面的人(输入的数字)一个个上台挑战。
-
如果挑战者比擂主更小,挑战者就打败擂主,成为新的擂主。
-
如果挑战者比擂主大,挑战失败,擂主不变。
-
所有人挑战完毕后,站在擂台上的就是最强(最小)的那个。
三、程序执行流程逐步解析
下面按照程序实际执行的顺序,逐步讲解每一步在做什么。所有代码片段在文末统一给出,这里只讲逻辑。
【第 1 步】程序开始
程序从主函数开始执行。首先需要准备两个变量:
-
一个用来存放数字的个数,记为 n。
-
一个用来存放当前的最小值,记为 minl。
【第 2 步】初始化最小值变量
将 minl 初始化为 9999。
为什么初始值设为 9999?
题目保证 0 ≤ aᵢ ≤ 1000,也就是说所有输入的数字最大不超过 1000。
-
如果把 minl 初始化为 9999,那么第一个读入的数 x 一定满足 x < 9999(因为 x 最大才 1000)。
-
所以第一个数一定会成功地成为新的 minl,这样 minl 就不会停留在初始值 9999 上,而是被真实输入的数字替换。
反例: 如果把 minl 初始化为 0,而输入全是正数(比如 5 7 4 2 6),那么“x < minl”永远不成立(因为 x 都大于 0),最后输出的就是错误的 0。
【第 3 步】读入数字个数 n
从输入流中读取一个整数,存入 n。
以样例为例,此时 n = 5。
【第 4 步】循环读入并比较
这是整个程序的核心部分。使用一个循环,循环变量 i 从 1 开始,每次加 1,直到 i 大于 n 时停止。因此循环体会执行 n 次,正好对应 n 个数字。
(1)读入一个数字
在循环体内定义一个临时变量 x,用来存放当前读入的数字。每次从输入流中读取下一个整数,遇到空格或换行自动分隔。
以样例为例:
-
第一次循环读入 5
-
第二次循环读入 7
-
第三次循环读入 4
-
第四次循环读入 2
-
第五次循环读入 6
(2)核心比较:打擂台
判断当前读入的数 x 是否比当前擂主 minl 更小。
-
如果成立,让 x 成为新的擂主(即把 minl 更新为 x)。
-
如果不成立,说明 x 比当前最小值大(或相等),擂主不变。
(3)循环结束后
循环结束后,minl 就是所有输入数字中的最小值。
【第 5 步】输出结果
把最终的最小值 minl 输出到屏幕,并换行。
#include<bits/stdc++.h> // 万能头文件 using namespace std; int main(){ //最值问题:最大值 最小值 int n, minl = 9999; // n:数字个数 minl:当前最小值(初始设为比所有输入都大的数) cin >> n; // 读入数字个数 for(int i = 1; i <= n; i++){ // 循环 n 次 int x; // x:当前读入的数 cin >> x; // 读入一个数 if(x < minl) minl = x; // 如果当前数比擂主小,就更新擂主 } cout << minl << endl; // 输出最终的最小值 return 0; }

浙公网安备 33010602011771号