【NOI-题解】1154. 数组元素的查找1152. 求n个数的最大值和最小值1168. 歌唱比赛评分1810. 最贵商品和最便宜商品分别有几个

一、前言

本章节主要对数组问题中找数的问题进行讲解,包括《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.分析问题

  1. 已知: m 个整数 ( 0≤m≤100 );
  2. 未知:查找其中有无值为 n 的数;
  3. 关系:有则输出该数第一次出现的位置,没有则输出 -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.分析问题

  1. 已知:n 个整数(1≤n≤20);
  2. 未知:输出它们的最大值,最小值;
  3. 关系:打擂台 ;

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.分析问题

  1. 已知:N 个分数(5≤N≤10);
  2. 未知:该选手的最后得分(保留两位小数)。
  3. 关系:去掉一个最高分,去掉一个最低分,剩下的评委的平均分即为该选手的最后得分。

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.分析问题

  1. 已知:N (n≤100)件商品,每件商品的价格都是整数(价格不会全都一样);

  2. 未知:最贵商品和最便宜商品分别有几个;

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

三、感谢

如若本文对您的学习或工作有所启发和帮助,恳请您给予宝贵的支持——轻轻一点,为文章点赞;若觉得内容值得分享给更多朋友,欢迎转发扩散;若认为此篇内容具有长期参考价值,敬请收藏以便随时查阅。

每一次您的点赞、分享与收藏,都是对我持续创作和分享的热情鼓励,也是推动我不断提供更多高质量内容的动力源泉。期待我们在下一篇文章中再次相遇,共同攀登知识的高峰!

在这里插入图片描述

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 09:26:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 09:26:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 09:26:03       58 阅读
  4. Python语言-面向对象

    2024-07-18 09:26:03       69 阅读

热门阅读

  1. app自动化测试缓存问题如何解决?

    2024-07-18 09:26:03       21 阅读
  2. 【Go系列】Go语言的测试

    2024-07-18 09:26:03       21 阅读
  3. OPPO 2024届校招正式批笔试题-后端(C卷)

    2024-07-18 09:26:03       23 阅读
  4. Caffeine缓存

    2024-07-18 09:26:03       23 阅读
  5. GO语言用http包发送带json文本body的GET请求

    2024-07-18 09:26:03       21 阅读
  6. Ubuntu 20 安装 uwsgi 失败解决办法

    2024-07-18 09:26:03       20 阅读
  7. 构建艺术:在Gradle中配置父子项目的关系

    2024-07-18 09:26:03       25 阅读
  8. (79)组合环路--->(03)组合环路代码示例一

    2024-07-18 09:26:03       22 阅读