C++基础-编程练习题和答案(数组2)

文章目录


前言

在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;  
}
相关推荐
架构文摘JGWZ17 分钟前
Java 23 的12 个新特性!!
java·开发语言·学习
leon62518 分钟前
优化算法(一)—遗传算法(Genetic Algorithm)附MATLAB程序
开发语言·算法·matlab
CV工程师小林18 分钟前
【算法】BFS 系列之边权为 1 的最短路问题
数据结构·c++·算法·leetcode·宽度优先
white__ice1 小时前
2024.9.19
c++
天玑y1 小时前
算法设计与分析(背包问题
c++·经验分享·笔记·学习·算法·leetcode·蓝桥杯
锦亦之22331 小时前
QT+OSG+OSG-earth如何在窗口显示一个地球
开发语言·qt
我是苏苏1 小时前
Web开发:ABP框架2——入门级别的增删改查Demo
java·开发语言
姜太公钓鲸2331 小时前
c++ static(详解)
开发语言·c++
菜菜想进步1 小时前
内存管理(C++版)
c语言·开发语言·c++
2301_789985941 小时前
Java语言程序设计基础篇_编程练习题*18.29(某个目录下的文件数目)
java·开发语言·学习