文章目录
- 前言
- 一、植树
- 二、校门外的树
- 三、排除第一个异形基因
- 四、比身高
- 五、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;  
}