文章目录
- 前言
- 一、植树
- 二、校门外的树
- 三、排除第一个异形基因
- 四、比身高
- 五、supercell做核酸
前言
在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 分钟
#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
代码实现:
#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
代码实现:
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++代码实现
#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++代码实现
#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;
}