文章目录
前言
在C++中,数组是一种数据结构,它允许在内存中连续存储相同类型的元素。数组是静态的,这意味着它们在编译时必须指定大小,并且在程序执行期间不能改变大小。数组是通过索引来访问的,索引从0开始。本文考察C++数组的使用,数组的定义和初始化、数组元素的查找、数组的插入、删除等
一、植树
【试题描述】
Star为了参加编程选拔考试已经做好了非常充分的准备,但是他有个最重要的毛病就是他十分的粗心,
为了能在考试中不犯低级错误, 拿到比较好的成绩, star 决定做件好事来增加他的 rp。
做什么好事呢? star 想到了常州好多道路刚修好, 路边的绿化还没有好,
于是 star 决定为一条刚修好的马路两旁种上树木。 当然这一定是 star 亲自抄手(挖坑,
种树, 浇水......工程量好大, 为了 rp, star 豁出去了, 再累再苦也干) , 道路每隔 5 米种一棵树,
正常情况下 star 种一棵树需要 16 分钟, 但是由于有部分位置的土壤质地不一样,
所以 star 种树的时间有时会和正常情况不一样, 质地软的就种得快, 质地硬的就种得慢,
当然不一样的土壤是预先知道的, 所以 star 想统计他种完一条路上的树需要多少时间。
【输入要求】
第一行两个正整数 m 和 n,m 表示道路有 m 米, (m 保证是 5 的倍数) , n 表示有 n 段不
同质地的土壤; m<=100,n<=20;
第二行到 n+1 行每行 3 个整 i,j,k 表示从第 i 米开始到 j 米结束这段道路的质地是一样的,
(i<=j)在这些地上每种树需要耗费 k 分钟时间, 道路起始位置为 0, 起始位置当然也是要植树的。
【输出要求】
一行一个整数(保证在 longint 范围) , star 种完一条道路上的树需要的总时间, 注意道路的两边都要植树。
【输入样例】
15 3
0 10 15
11 12 10
13 15 20
【输出样例】
130
【知识点及提示】
样例解释: 一共需要植 8 棵树, 一边四棵。 分别种在 0 5 10 15 号位置共需要(15+15+15+20) *2=130 分钟
cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
int m, n;
// 输入道路长度和土壤区域数量
cin >> m >> n;
// 道路每5米一棵树,因此树的数量是m/5+1
int len=m/5+1;
//存放每一棵数需要的时间
// 初始化种植时间数组,假设初始都是16分钟
int times[len];
for(int i = 0; i < len; ++i) {
times[i]=16;
}
int count=0;
// 读取土壤区域信息
for (int i = 0; i < n; ++i) {
// start:开始位置 end:结束位置 cost:耗费的时间
int start, end, cost;
cin >> start >> end >> cost;
for (int pos = start; pos <= end; ++pos) {
//如果对5取余为0则说明该点需要种树
if (pos % 5 == 0) {
//记录该点种树需要的时间
times[count] = cost;
count=count+1;
}
}
}
// 计算总的种植时间
int t = 0;
for (int i = 0; i < len; ++i) {
// 两边都要植树,所以要乘以2
t += times[i] * 2;
}
cout << t ; // 输出结果
return 0;
}
二、校门外的树
【试题描述】
某校大门外长度为 L 的马路上有一排树, 每两棵相邻的树之间的间隔都是 1 米。
我们可以把马路看成一个数轴, 马路的一端在数轴 0 的位置, 另一端在 L 的位置;
数轴上的每个整数点, 即 0, 1, 2, ......, L, 都种有一棵树。
由于马路上有一些区域要用来建地铁。 这些区域用它们在数轴上的起始点和终止点表示。
已知任一区域的起始点和终止点的坐标都是整数, 区域之间可能有重合的部分。
现在要把这些区域中的树(包括区域端点处的两棵树) 移走。 你的任务是计算将这些树都移走后, 马路上还有多少棵树。
【 输入要求】
第一行有两个整数 L( 1 <= L <= 10000) 和 M( 1 <= M <= 100) , L 代表马路的长度, M代表区域的数目, L 和 M 之间用一个空格隔开。
接下来的 M 行每行包含两个不同的整数, 用一个空格隔开, 表示一个区域的起始点和终止点的坐标。
【 输出要求】
一个整数, 表示马路上剩余的树的数目。
【 输入样例】
500 3
150 300
100 200
470 471
【 输出样例】
298
代码实现:
cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
int L, M;
cin >> L >> M;
//创建一个大小为L+1的数组,初始值1
int t[L+1];
for (int i = 0; i < L+1; i++) {
t[i]=1;
}
// 读取区域的起始点和终止点的坐标
for (int i = 0; i < M; i++) {
int start, end;
cin >> start >> end;
for(int j=start;j<=end;j++) {
t[j]=0;
}
}
// 计算累积和并计算剩余树的数量
int count = 0;
for (int i = 0; i < L+1; i++) {
if(t[i]==1){
count=count+1;
}
}
cout << count;
return 0;
}
三、排除第一个异形基因
【 试题描述】
神舟 X 号飞船在完成宇宙探险任务回到地球后, 宇航员杨利伟感觉身体不太舒服, 去了医院检查,
医生诊断结果: 杨利伟体内基因已被改变, 原有人体基因序列中已经被渗入外星球不明异形生物基因,
但可喜的是, 这些异形基因都有一个共同的特征, 就是该基因序号的平方除以 7 的余数都是 1, 要赶快清除掉, 否则会危害整个人类。 赶快行动吧。
( 仅去除第一个异型基因)
【 输入要求】
第一行是一个整数 n( 基因个数) 第二行是 n 个整数( 杨利伟的基因序列)
【 输出要求】
去除第一个异形基因后的正常序列, 空格隔开
【 输入样例】
4
6 2 8 12
【 输出样例】
2 8 12
代码实现:
cpp
int main() {
int n;
cin >> n; // 读取基因个数
int genes[n];
// 读取基因序列
for (int i = 0; i < n; ++i) {
cin >> genes[i];
}
// 查找并去除第一个异形基因
for (int i = 0; i < n; ++i) {
int m= genes[i];
if ((m * m) % 7 == 1) { // 检查是否是异形基因
// 去除异形基因
for(int j=i;j<n;j++){
genes[j]=genes[j+1];
}
break; // 只需要去除第一个,所以找到后退出循环
}
}
// 输出剩余基因序列
for (int i = 0; i < n-1; ++i) {
cout << genes[i];
if (i < n - 1) {
cout << " "; // 在最后一个基因前不输出空格
}
}
return 0;
}
四、比身高
【 试题描述】
有 N 个人排成一排, 假设他们的身高均为正整数, 请找出其中符合以下条件的人:
排在他前面且比他高的人数与排在他后面且比他高的人数相等。
【 输入要求】第一行为一个正整数 N, 1<N<1000, 表示有多少个人。
下面 N 行, 每行一个正整数, 表示从前往后每个人的身高, 假设每个人的身高≤10000。
【输出要求】
一行一个整数, 表示满足这个条件的人数。
【输入样例】
4
1
2
1
3
【输出样例】
2
C++代码实现
cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
int N;
cin >> N;
int heights[N];
for (int i = 0; i < N; ++i) {
cin >> heights[i];
}
// 初始化一个数组来记录从当前位置到末尾比该位置身高高的人数
int tallerCount[N];
for (int i = 0; i < N; ++i) {
tallerCount[i]=0;
}
// 从后往前遍历,计算每个位置之后有多少人比他高
for (int i = N - 1; i >= 0; --i) {
for (int j = i + 1; j < N; ++j) {
if (heights[j] > heights[i]) {
tallerCount[i]++;
}
}
}
//满足条件的人数
int count = 0;
// 因为我们已经有了tallerCount数组
for (int i = 0; i < N; ++i) {
int prevTaller = 0;
for (int j = 0; j < i; ++j) {
if (heights[j] > heights[i]) {
prevTaller++;
}
}
// 如果前面比他高的人数(i之前的所有人)等于后面比他高的人数(tallerCount[i])
if (prevTaller == tallerCount[i]) {
count++;
}
}
cout << count;
return 0;
}
五、supercell做核酸
【试题描述】
众所周知, supercell 是一家全球有名的游戏公司, 荒野乱斗, 皇室战争, 部落冲突...
这些优质游戏都是他们开发的。
2020 年, 新冠状病毒爆发, 荒野乱斗的策划 mark 决定每天随机让 5 个工作人员做核酸。
这个决定进行了 n 天(n<=50)。 作为荒野乱斗粉丝的你, 想知道在这 n 天里, 谁做核酸的次数最多。
【输入要求】
第一行 1 个整数 n(n<=50) , 表示做核酸的天数。
第 2 行到 n+1 行, 每行 5 个数, 表示 5 位工作人员的员工号。
【输出要求】
每行两个整数, 格式为工作号+空格+做核酸的次数
【输入样例】
5
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
5 6 7 8 9
【输出样例】
5 5
【知识点及提示】
如果有多个相同的最大数, 则全输出。
C++代码实现
cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
//记录员工做核酸数据
int test[5*n] ;
//员工个数
int m=50 ;
// 记录每个员工做核酸的次数
int testCounts[m]={0};
// 读取数据并更新做核酸的次数
for (int i = 0; i < 5*n; i++) {
cin >> test[i];
testCounts[test[i]]++; // 增加对应员工号的做核酸次数
}
// 找出做核酸次数最多的次数
int maxTests = 0;
for(int i=0;i<m;i++){
// maxTests = max(maxTests, testCounts[i]);
if(maxTests<testCounts[i]) {
maxTests=testCounts[i];
}
}
// 输出做核酸次数最多的员工及其次数
for(int i=0;i<m;i++){
int t=testCounts[i];
if(t==maxTests){
cout << i << " " << testCounts[i] << endl;
}
}
return 0;
}