C++算法竞赛篇(六)一维数组题型讲解
C++算法竞赛篇(六)一维数组题型讲解
- 前言
- C++ 一维数组题型讲解
- 第一题 查找特定的值
- 第二题 向量点积计算
- 第三题 年龄与疾病
- 第四题 小鱼比可爱
前言
- 前面的题型里我们认识了C++循环嵌套题型
- 本篇博客我们开始讲解一维数组题型讲解
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的C++算法竞赛篇文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_13001405.html?spm=1001.2014.3001.5482
C++ 一维数组题型讲解
第一题 查找特定的值
题目链接 https://www.luogu.com.cn/problem/B2093
解题思路
-
输入处理:
- 先读取整数
n
(数组长度),再通过循环读取n
个整数存入数组arr
。 - 最后读取目标值
x
(需要查找的数)。
- 先读取整数
-
遍历查找逻辑:
- 用
for
循环遍历数组arr
(索引i
从0
到n-1
)。 - 若找到
arr[i] == x
,立即输出当前索引i
并break
(保证找到第一个匹配项)。
- 用
-
未找到处理:
- 若循环结束后
i == n
(遍历完数组仍无匹配),输出-1
。
- 若循环结束后
#include <iostream>
using namespace std;
const int N = 10010;
int arr[N];int main()
{int n;int x;cin >> n;for(int i = 0; i < n; i++){cin >> arr[i];}cin >> x;int i = 0;for(i = 0; i < n; i++){if(arr[i] == x){cout << i << endl;break;}}if(i == n)cout << -1 << endl;return 0;
}
第二题 向量点积计算
题目链接 https://www.luogu.com.cn/problem/B2091
解题思路
-
输入准备:
- 定义两个数组
a
和b
(长度足够存储n
个元素,代码中用const int N = 1010
预定义)。 - 读取
n
后,分别用循环读取n
个整数存入a
和b
(代码中用 1-based 下标,更贴近数学习惯)。
- 定义两个数组
-
点积计算逻辑:
- 点积公式:对应下标元素相乘后累加求和(即
sum += a[i] * b[i]
)。 - 用
for
循环遍历下标i
(从1
到n
),依次计算并累加乘积。
- 点积公式:对应下标元素相乘后累加求和(即
-
结果输出:
- 遍历结束后,输出
sum
(即两个向量的点积结果)。
- 遍历结束后,输出
#include <iostream>
using namespace std;const int N = 1010;
int a[N];
int b[N];
int sum = 0;int main()
{int n = 0;cin >> n;for(int i = 1; i <= n; i++){cin >> a[i];}for(int i = 1; i <= n; i++){cin >> b[i];}for(int i = 1; i <= n; i++){sum += a[i] * b[i];}cout << sum << endl;return 0;
}
第三题 年龄与疾病
题目链接 https://www.luogu.com.cn/problem/B2090
解题思路
-
分类统计逻辑:
- 定义
n1~n4
四个变量,分别统计 4 个年龄段 的人数(0-18
、19-35
、36-60
、61+
)。 - 读取总人数
n
后,循环n
次读取年龄age
,通过if-else
判断age
所属区间,对应增加n1~n4
的计数。
- 定义
-
百分比计算:
- 每个区间的百分比公式:
(n_i * 1.0 / n) * 100
(用1.0
转换为浮点数,避免整数除法丢失精度)。
- 每个区间的百分比公式:
-
格式化输出:
- 用
printf("%.2f%%\n", ...)
输出,保留两位小数并显示百分号(%%
转义为单个%
)。
- 用
#include <iostream>
#include <cstdio>
using namespace std;int n1;
int n2;
int n3;
int n4;int main()
{int n;int age;cin >> n;// 统计for(int i = 0; i < n; i++){cin >> age;if(age >= 0 && age <= 18)n1++;else if(age >= 19 && age <= 35)n2++;else if(age >= 36 && age <= 60)n3++;elsen4++;}printf("%.2f%%\n", n1 * 1.0 / n * 100);printf("%.2f%%\n", n2 * 1.0 / n * 100);printf("%.2f%%\n", n3 * 1.0 / n * 100);printf("%.2f%%\n", n4 * 1.0 / n * 100);return 0;
}
第四题 小鱼比可爱
题目链接 https://www.luogu.com.cn/problem/P1428
解题思路
-
输入数组:
- 读取整数
n
(小鱼数量),再读取n
个整数存入数组arr
(记录每条小鱼的“可爱值”)。
- 读取整数
-
双重循环统计逻辑:
- 外层循环:遍历每条小鱼(索引
i
从0
到n-1
)。 - 内层循环:遍历当前小鱼左边的所有小鱼(索引
j
从0
到i-1
)。 - 若
arr[j] < arr[i]
(左边小鱼可爱值更小),则count++
(统计符合条件的数量)。
- 外层循环:遍历每条小鱼(索引
-
结果输出:
- 内层循环结束后,输出当前小鱼的
count
,并用空格分隔。所有小鱼处理完后,输出换行符。
- 内层循环结束后,输出当前小鱼的
#include <iostream>
using namespace std;const int N = 110;
int arr[N];int main()
{int n = 0;cin >> n;for(int i = 0; i < n; i++){cin >> arr[i];}for(int i = 0; i < n; i++){int count = 0;for(int j = 0; j < i; j++){if(arr[j] < arr[i]){count++;}}cout << count << " ";}cout << endl;return 0;
}
以上就是这篇博客的全部内容,下一篇我们将继续探索C++算法的更多精彩内容。
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的C++算法竞赛篇文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_13001405.html?spm=1001.2014.3001.5482
非常感谢您的阅读,喜欢的话记得三连哦 |