一、前言
本章节主要对数组问题中找数的问题进行讲解,包括《1154. 数组元素的查找》《1152. 求n个数的最大值和最小值》《1168. 歌唱比赛评分》《1810. 最贵商品和最便宜商品分别有几个》题目
二、问题
问题:1154. 数组元素的查找
类型:数组找数
题目描述:
给你 m 个整数,查找其中有无值为 n 的数,有则输出该数第一次出现的位置,没有则输出 −1 。
输入:
第一行一个整数 m 代表数的个数 ( 0≤m≤100 ) 。
第二行 m 个整数(空格隔开)( 这些数在0∼1000000范围内 )。
第三行为要查找的数 n。
输出:
n 的位置或 −1。
样例:
输入:
4
1 2 3 3
3
输出:
3
1.分析问题
- 已知: m 个整数 ( 0≤m≤100 );
- 未知:查找其中有无值为 n 的数;
- 关系:有则输出该数第一次出现的位置,没有则输出 -1 。
2.定义变量
- m: 存储数组中整数的数量。
- n: 需要查找的目标值。
- idx: 初始化为-1,用于记录目标值n第一次出现的位置。
- a[110]: 定义一个足够大的数组来存储输入的整数。
//二、定义变量(已知、未知、关系)
int m,n,idx=-1,a[110];
3.输入数据
- 先输入整数的数量m,然后依次输入m个整数到数组a中,最后输入要查找的目标值n。
//三、输入已知
cin>>m;
for(int i=1;i<=m;i++){
cin>>a[i];
}
cin>>n;
4.数据计算
- 使用一个循环遍历数组a,比较每个元素是否等于目标值n。如果找到匹配项,则将当前索引i赋值给idx并退出循环。
//四、根据关系计算
for(int i=1;i<=m;i++){
if(n==a[i]){
idx=i;
break;
}
}
5.输出结果
- 直接输出变量idx的值。如果找到了目标值,idx会被更新为其位置;否则,保持初始值-1,表示未找到。
//五、输出未知
cout<<idx;
完整代码如下:
#include <bits/stdc++.h> // 引入常用头文件,包含了许多标准库函数
using namespace std; // 使用std命名空间,避免std::前缀
int main() {
// 一、问题分析
// 给定m个整数构成的数组,以及一个目标值n,要求找出n在数组中首次出现的位置,若不存在则输出-1。
int m, n, idx = -1; // 初始化变量
int a[110]; // 定义足够大的数组来存放输入的整数序列
// 三、输入数据
cin >> m; // 输入整数数量m
for (int i = 1; i <= m; i++) {
cin >> a[i]; // 输入m个整数到数组a中
}
cin >> n; // 输入需要查找的目标值n
// 四、查找目标值n在数组中的位置
for (int i = 1; i <= m; i++) { // 遍历数组
if (n == a[i]) { // 如果当前元素等于目标值n
idx = i; // 记录该位置到idx
break; // 找到后立即跳出循环
}
}
// 五、输出结果
cout << idx << endl; // 输出目标值n在数组中的位置,未找到则输出-1
return 0; // 程序成功执行完毕,返回0
}
问题:1152. 求n个数的最大值和最小值
类型:数组找数
题目描述:
任意输入 n 个整数,把它们的最大值,最小值求出来。
输入:
输入只有一行,包括一个整数 n (1≤n≤20),后面跟着 n 个数, 每个数的范围在0∼32767之间。
输出:
输出只有一行,包括 2 个整数。
样例:
输入:
5 1 99 3 6 0
输出:
99 0
1.分析问题
- 已知:n 个整数(1≤n≤20);
- 未知:输出它们的最大值,最小值;
- 关系:打擂台 ;
2.定义变量
- n: 存储数组中整数的数量。
- a[22]: 定义一个足够大的数组来存储输入的n个整数。
- mmax: 初始化为INT_MIN,表示初始时认为的最大值。
- mmin: 初始化为INT_MAX,表示初始时认为的最小值。
//二、定义变量(已知、未知、关系)
int n,a[22],mmax=INT_MIN,mmin=INT_MAX;
3.输入数据
- 首先读取整数n,然后通过一个循环读取n个整数到数组a中。
//三、输入已知
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
4.数据计算
- 在读取每个整数的同时,将其与当前的mmax和mmin比较,如果当前整数更大,则更新mmax;如果更小,则更新mmin。这样的做法确保了只需遍历一次数组即可找到这两个值。
//四、根据关系计算
if(a[i]>mmax) mmax=a[i];
if(a[i]<mmin) mmin=a[i];
5.输出结果
- 直接输出找到的最大值mmax和最小值mmin。
//五、输出未知
cout<<mmax<<" "<<mmin;
完整代码如下:
#include <bits/stdc++.h> // 引入常用头文件,包含大量标准库功能
using namespace std; // 使用std命名空间,简化代码中的标准库调用
int main() {
// 一、问题分析
// 给定一个包含n(1≤n≤20)个整数的数组,要求找出并输出其中的最大值和最小值。
int n, a[22]; // n为数组长度,a[]用于存储数组元素
int mmax = INT_MIN, // 初始化最大值为整型最小值,确保任何输入值都能成为新最大值
mmin = INT_MAX; // 初始化最小值为整型最大值,确保任何输入值都能成为新最小值
// 三、输入数组长度及元素
cin >> n; // 输入数组长度n
for (int i = 0; i < n; i++) { // 循环读取n个整数
cin >> a[i]; // 读取第i个整数
// 四、打擂台法计算最大值和最小值
// 比较并更新当前最大值和最小值
if (a[i] > mmax) {
mmax = a[i]; // 如果当前元素大于mmax,则更新mmax
}
if (a[i] < mmin) {
mmin = a[i]; // 如果当前元素小于mmin,则更新mmin
}
}
// 五、输出结果
cout << mmax << " " << mmin << endl; // 输出数组中的最大值和最小值
return 0; // 表示程序成功执行结束
}
问题:1168. 歌唱比赛评分
类型:数组找数
题目描述:
四(1) 班要举行一次歌唱比赛,以选拔更好的苗子参加校的歌唱比赛。评分办法如下:设 N 个评委,打 N 个分数( 0≤每个分数≤10 ),去掉一个最高分,去掉一个最低分,剩下的评委的平均分即为该选手的最后得分。
但是选手太多了,靠人工计算每个选手的得分太慢太麻烦。你能不能帮帮他们,设计一个程序让计算机来算出选手的最后得分呢?
输入:
第一行为一个整数 N (5≤N≤10);
第二行为 N 个整数 Ai (0≤Ai≤10 )。
输出:
选手的最后得分(保留两位小数)。
样例:
输入:
5
5 6 7 8 9
输出:
7.00
1.分析问题
- 已知:N 个分数(5≤N≤10);
- 未知:该选手的最后得分(保留两位小数)。
- 关系:去掉一个最高分,去掉一个最低分,剩下的评委的平均分即为该选手的最后得分。
2.定义变量
- n为评委数量,
- a[]数组存储每个评委的分数,
- mmax为最高分,
- mmin为最低分,
- r初始化总分为0,用于累加所有分数。
//二、定义变量(已知、未知、关系)
int n,a[11],mmax=INT_MIN,mmin=INT_MAX;
double r=0.0;
3.输入数据
- 输入评委数量及各评委分数。
- 并找出最高分和最低分。
//三、输入已知
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
r+=a[i];
if(a[i]>mmax) mmax=a[i];
if(a[i]<mmin) mmin=a[i];
}
4.数据计算
- 去掉一个最高分和一个最低分,计算剩余分数的平均值。
//四、根据关系计算
r=(r-mmax-mmin)/(n-2);
5.输出结果
- 输出最终得分。
//五、输出未知
cout<<fixed<<setprecision(2)<<r;
完整代码如下:
#include <bits/stdc++.h> // 引入常用的头文件,包含了很多标准库函数
using namespace std; // 使用std命名空间,简化代码
int main() {
// 一、问题分析
// 已知:有N个评委的分数(5≤N≤10);
// 未知:去掉一个最高分和一个最低分后,剩余分数的平均值,即选手的最后得分(保留两位小数)。
int n, a[11]; // n为评委数量,a[]数组存储每个评委的分数
double r = 0.0; // 初始化总分为0,用于累加所有分数
int mmax = INT_MIN, // 初始化最大分数为整型最小值,确保任何输入都是大值
mmin = INT_MAX; // 初始化最小分数为整型最大值,确保任何输入都是小值
// 三、输入评委数量及各评委分数
cin >> n; // 输入评委数量n
for (int i = 0; i < n; i++) {
cin >> a[i]; // 输入第i个评委的分数
r += a[i]; // 累加分数到总分r中
// 同时更新最大值和最小值
if (a[i] > mmax) mmax = a[i];
if (a[i] < mmin) mmin = a[i];
}
// 四、根据规则计算最终得分
// 去掉一个最高分和一个最低分,计算剩余分数的平均值
r = (r - mmax - mmin) / (n - 2);
// 五、输出最终得分,保留两位小数
cout << fixed << setprecision(2) << r; // 使用fixed设置小数点后固定位数,setprecision设置精度为2位
return 0; // 程序执行完毕,返回0表示成功
}
问题:1810. 最贵商品和最便宜商品分别有几个
类型:数组找数
题目描述:
小明去超市买商品,买了 N 件,每件商品的价格都是整数(价格不会全都一样),小明想知道这 N 件商品中,最贵商品和最便宜商品分别有几个(最贵和最便宜分别可以有多个)?请你编写程序帮忙小明计算。
输入:
第 1 行有一个整数 n(n≤100)。
第 2 行有 n 个整数,用空格隔开。
输出:
输出 2 个整数,用空格隔开,第 1 个整数代表最贵的商品有几个,第 2 个整数代表最便宜的商品有几个。
样例:
输入:
6
12 3 3 15 34 17
输出:
1 2
1.分析问题
已知:N (n≤100)件商品,每件商品的价格都是整数(价格不会全都一样);
未知:最贵商品和最便宜商品分别有几个;
2.定义变量
- n: 商品总数。
- a[110]: 存储每个商品的价格,数组大小足够大以容纳最多100件商品。
- mmax: 初始化为INT_MIN,用于存储遇到的最高价格。
- mmin: 初始化为INT_MAX,用于存储遇到的最低价格。
- cmax和cmin: 初始化为0,分别用于计数最高价和最低价商品的数量。
//二、定义变量(已知、未知、关系)
int n,a[110],mmax=INT_MIN,mmin=INT_MAX,cmax=0,cmin=0;
3.输入数据
- 首先接收商品的总数n,然后逐一输入每个商品的价格到数组a中。在输入过程中,同时更新最大值mmax和最小值mmin。
//三、输入已知
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
if(a[i]>mmax) mmax=a[i];
if(a[i]<mmin) mmin=a[i];
}
4.数据计算
- 在所有商品价格都已知后,程序再次遍历数组,统计出最贵商品(价格等于mmax)和最便宜商品(价格等于mmin)的数量。
//四、根据关系计算
for(int i=0;i<n;i++){
if(a[i]==mmax) ++cmax;
if(a[i]==mmin) ++cmin;
}
5.输出结果
- 最后,输出最贵商品的数量cmax和最便宜商品的数量cmin。
//五、输出未知
cout<<cmax<<" "<<cmin;
完整代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
// 一、分析问题
// 已知:N 件商品的价格(n≤100),价格为整数且各不相同。
// 未知:最贵商品和最便宜商品分别有几个。
int n, a[110], mmax = INT_MIN, mmin = INT_MAX, cmax = 0, cmin = 0;
// 三、输入数据
cin >> n; // 先输入商品总数n
for(int i = 0; i < n; i++){
cin >> a[i]; // 然后依次输入n个商品的价格
// 在读取价格的同时,更新mmax和mmin
if(a[i] > mmax) mmax = a[i];
if(a[i] < mmin) mmin = a[i];
}
// 四、根据输入数据计算最贵和最便宜商品的数量
//已知所有商品价格后,再统计最贵和最便宜商品的数量
for(int i = 0; i < n; i++){
if(a[i] == mmax) ++cmax; // 如果当前价格等于目前的最大价格,最贵商品计数加1
if(a[i] == mmin) ++cmin; // 如果当前价格等于目前的最小价格,最便宜商品计数加1
}
// 五、输出未知
cout << cmax << " " << cmin; // 输出最贵和最便宜商品的数量
return 0;
}
三、感谢
如若本文对您的学习或工作有所启发和帮助,恳请您给予宝贵的支持——轻轻一点,为文章点赞;若觉得内容值得分享给更多朋友,欢迎转发扩散;若认为此篇内容具有长期参考价值,敬请收藏以便随时查阅。
每一次您的点赞、分享与收藏,都是对我持续创作和分享的热情鼓励,也是推动我不断提供更多高质量内容的动力源泉。期待我们在下一篇文章中再次相遇,共同攀登知识的高峰!