题解:洛谷 P5718 找最小值
【题目来源】
【题目描述】
给出 \(n\) 和 \(n\) 个整数 \(a_i\),求这 \(n\) 个整数中最小值是什么。
【输入】
第一行输入一个正整数 \(n\),表示数字个数。
第二行输入 \(n\)个非负整数,表示 \(a_1,a_2,\dots,a_n\),以空格隔开。
【输出】
输出一个非负整数,表示这 \(n\) 个非负整数中的最小值。
【输入样例】
8
1 9 2 6 0 8 1 7
【输出样例】
0
【核心思想】
-
问题分析:给定 \(n\) 个非负整数,求其中的最小值。这是一个基础的线性扫描问题。
-
算法选择:
- 顺序比较:遍历数组,维护当前最小值,遇到更小的数则更新
-
关键步骤:
- 读入数据:
cin >> n读取数字个数,循环读入 \(n\) 个数到数组 \(a[1..n]\) - 初始化最小值:
min = a[1],假设第一个数为最小值 - 线性扫描(\(i\) 从 \(2\) 到 \(n\)):
- 若
min > a[i],则min = a[i](更新最小值)
- 若
- 输出结果:
cout << min
- 读入数据:
-
时间/空间复杂度:
- 时间复杂度:\(O(n)\),需要遍历所有 \(n\) 个数一次
- 空间复杂度:\(O(n)\),存储 \(n\) 个数的数组(可优化至 \(O(1)\) 边读边比较)
-
线性扫描的核心思想:
- 假设-验证-更新:先假设第一个元素为最小值,然后逐一验证后续元素,发现更小值立即更新
- 遍历完备性:必须检查每个元素,任何一个遗漏都可能导致错误结果
- 空间可优化:最小值问题无需存储所有数,可边读入边比较,将空间降至 \(O(1)\)
- 适用于最值查找、线性遍历、基准比较类入门问题
【算法标签】
入门 #模拟
【代码详解】
#include <bits/stdc++.h> // 包含标准库头文件(万能头文件)
using namespace std; // 使用标准命名空间
/**
* 主函数 - 程序入口
* @return 程序执行状态码(0表示成功)
*/
int main()
{
int n; // 定义变量:数字个数n
int min; // 定义变量:最小值
int a[10000]; // 定义数组:存储输入的数字
cin >> n; // 输入数字个数
// 输入n个数字到数组
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
min = a[1]; // 初始化最小值为第一个元素
// 遍历数组查找最小值
for (int i = 2; i <= n; i++)
{
if (min > a[i]) // 如果当前元素比最小值小
{
min = a[i]; // 更新最小值
}
}
cout << min; // 输出最小值
return 0; // 程序正常结束
}
【运行结果】
8
1 9 2 6 0 8 1 7
0
浙公网安备 33010602011771号