STEM考试 C++组(6)
一、选择题
第一题(难度系数 2)
题目编号:22021801CX01 知识点考察:标识符
以下哪个选项可以作为变量名称?( )
*选择题严禁使用程序验证,选择题不答和答错不扣分
A、float B、_5b C、2_ab D、n!c
第二题(难度系数 2)
题目编号:22021801CX02 知识点:字符数组
已知:char str[] ="Hello World"; 以下哪个函数可以正确输出str的长度?( )
*选择题严禁使用程序验证,选择题不答和答错不扣分
A、sizeof() B、strlen() C、size() D、length()
第三题(难度系数 2)
题目编号:22021801CX03 知识点:字符数组
以下字符数组初始化正确的是( )。
*选择题严禁使用程序验证,选择题不答和答错不扣分
- char a[3]={“a”,“b”,“c”} B、char b[3]={‘a’}
C、char c[]={‘abc’} D、char d[3]={“abc”}
第四题(难度系数 3)
题目编号:22021801CX04 知识点:结构体
关于结构体,以下说法正确的是( )。
*选择题严禁使用程序验证,选择题不答和答错不扣分
A. 结构体的成员变量默认可以在结构体外部访问
B. 结构体的成员变量不能是结构体类型
C. 结构体类型的变量不能充当函数的参数
D. 当结构体的成员变量含有数组时,不能直接对结构体变量进行赋值
第五题(难度系数 4)
题目编号:22021801CX05 知识点:指针
已知:int m =8; 下列正确的引用方法是( ) 。
*选择题严禁使用程序验证,选择题不答和答错不扣分
A、float &b=m; B、int &b=8; C、int &z; D、int &b=m;
二、编程题
第一题(难度系数2,15 个计分点)
题目编号:22021801CB01 知识点:运算符
编程实现:求和
题目描述:
给定一个正整数N(1<N<106),求出N左右相邻两个正整数的和。
例如:N = 6,左边相邻的数为5,右边相邻的数为7,两数之和为12(12=5+7)。
输入描述:输入一个正整数N(1<N<106)
输出描述:输出一个整数,表示N左右相邻两个正整数的和
样例输入:6
样例输出:12
评分标准:
3分:能正确输出第一组数据;
3分:能正确输出第二组数据;
3分:能正确输出第三组数据;
3分:能正确输出第四组数据;
3分:能正确输出第五组数据。
测试用例:
输入 | 2 | 51 | 999 | 5678 | 13672 |
输出 | 4 | 102 | 1998 | 11356 | 27344 |
#include<iostream>
using namespace std;
int main() {
int n;
cin >> n;
cout << n * 2;
return 0;
}
第二题(难度系数 3,18 个计分点)
题目编号:22021801CB02 知识点:判断
编程实现:奇数
题目描述:
给定两个正整数N和M(10≤N<M≤10000),请找出N到M之间(包含N和M)的所有正整数中,哪些正整数的各个位上的数字都为奇数,并输出N到M之间共有多少个这样的正整数。
例如:N = 110,M = 119,
110到121之间的所有正整数有110、111、112、113、114、115、116、117、118、119;
其中各个位上的数字都为奇数的有111、113、115、117、119,共5个。
输入描述:输入两个正整数N和M(10≤N<M≤10000),正整数之间以一个英文逗号隔开
输出描述:输出N到M之间(包含N和M)的所有正整数中,各个位上的数字都为奇数的个数
样例输入:110,119
样例输出:5
评分标准:
3分:能正确输出第一组数据;
3分:能正确输出第二组数据;
3分:能正确输出第三组数据;
3分:能正确输出第四组数据;
3分:能正确输出第五组数据;
5分:能正确输出第六组数据。
测试用例:
输入 | 10,100 | 312,987 | 557,1000 | 988,1999 | 523,8976 | 234,10000 |
输出 | 25 | 94 | 62 | 130 | 570 | 725 |
#include<iostream>
using namespace std;
int main() {
int n, m, sum = 0, x;
cin >> n >> m;
for (int i = n; i <= m; i++) {
x = i;
bool f = false;
while (x) {
if (x % 2 == 0) {
f = true;
break;
}
x /= 10;
}
sum += f ? 0 : 1;
}
cout << sum;
return 0;
}
第三题(难度系数 3,20 个计分点)
题目编号:22021801CB03 知识点:循环 判断
编程实现:硬币
题目描述:
有N(2≤N≤50)个硬币正面朝上排成一排,每次反转任意3个硬币(正面反转后为反面,反面反转后为正面),请问最少反转几次可以使N个硬币全部反转成反面。
例如:
N=7,最少反转3次可以使7个硬币全部反转成反面。
第一次将第1、2、3的硬币反转为反面朝上;
第二次将第3个硬币反转为正面朝上,将第4、5的硬币为反面朝上;
第三次将第3、6、7的硬币反转为反面朝上。
输入描述:输入一个正整数N(2≤N≤50),表示硬币的个数
输出描述:输出一个整数,如果可以将N个正面朝上硬币全部反转成反面,就输出反转的次数,否则输出-1
样例输入:7
样例输出:3
评分标准:
3分:能正确输出第一组数据;
3分:能正确输出第二组数据;
3分:能正确输出第三组数据;
3分:能正确输出第四组数据;
3分:能正确输出第五组数据;
3分:能正确输出第六组数据。
测试用例:
输入 | 6 | 18 | 34 | 40 | 45 | 50 |
输出 | 4 | 7 | 12 | 14 | 18 | 28 |
#include<iostream>
using namespace std;
int main() {
int n, cnt = 0;
cin >> n;
cnt = n / 3;
if (n == 2) {
cnt = -1;
} else if(n == 4) {
cnt = 4;
} else if (n % 3 == 1) {
cnt += 1;
} else if (n % 3 == 2) {
cnt += 2;
}
cout << cnt;
return 0;
}
第四题(难度系数4,25个计分点)
题目编号:22021801CB04 知识点:递归 递推 搜索
编程实现:最大空白区
题目描述:
小明有一张矩形彩纸,他将彩纸均匀的画了N*M个小方格,有些小方格中被他画了小草,有些小方格是空白的,现小明想找出一片空白的方格,并且这片空白方格是最大的矩形。
现给出N和M的值,及每个方格的状态,被画小草的小方格用数字1表示,空白小方格用数字0表示,请帮小明找出最大矩形,并输出最大矩形由多少个小方格组成。
例如:N=4,M=5,
输入描述:
第一行输入两个正整数N和M(2≤N≤100,2≤M≤100),分别表示矩形彩纸方格的行数和列数,两个正整数之间以一个空格隔开
第二行开始,输入N行,每行M个正整数(正整数为1或者0),1表示小草,0表示空白,正整数之间一个空格隔开
输出描述:输出一个整数,表示最大矩形由多少个小方格组成
样例输入:
4 5
1 1 0 0 0
1 0 1 0 0
0 0 0 1 1
0 0 0 1 0
样例输出:
6
评分标准:
4分:能正确输出第一组数据;
4分:能正确输出第二组数据;
4分:能正确输出第三组数据;
4分:能正确输出第四组数据;
4分:能正确输出第五组数据;
5分:能正确输出第六组数据。
测试用例:
输入 | 2 2 1 0 1 0 | 3 6 1 0 1 0 1 0 0 1 0 0 0 1 1 0 1 0 1 0 | 4 5 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 | 7 10 1 0 1 1 1 0 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 0 0 1 1 0 0 0 1 0 1 1 0 1 0 0 1 0 1 0 0 1 0 0 0 1 0 1 1 0 1 1 0 1 0 0 1 0 1 0 | 9 13 1 0 1 1 0 1 0 1 0 1 1 0 1 1 1 0 1 0 1 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 1 1 0 0 1 1 0 0 1 1 0 0 0 0 0 1 1 0 1 0 0 1 1 0 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 1 0 1 0 0 1 1 0 1 0 0 1 0 1 0 1 1 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 1 0 1 |
输出 | 1 | 3 | 6 | 4 | 9 |
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
const int N = 50;
int a[N][N];
int main() {
int n, m;
cin >> n >> m;
vector<vector<int> > gl(n, vector<int>(m, 0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
if (a[i][j] == 0)
gl[i][j] = (j == 0 ? 1 : gl[i][j - 1] + 1);
}
}
int res = 0;
for (int j = 0; j < m; j++) {
vector<int> up(n, 0), down(n, 0);
stack<int> st;
for (int i = 0; i < n; i++) {
while (!st.empty() && gl[st.top()][j] >= gl[i][j]) {
st.pop();
}
up[i] = st.empty() ? -1 : st.top();
st.push(i);
}
st = stack<int> ();
for (int i = n - 1; i >= 0; i--) {
while(!st.empty() && gl[st.top()][j] >= gl[i][j]) {
st.pop();
}
down[i] = st.empty() ? n : st.top();
st.push(i);
}
for (int i = 0; i < n; i++) {
int height = down[i] - up[i] - 1;
int area = height * gl[i][j];
res = max(res, area);
}
}
cout << res;
return 0;
}
第五题(难度系数 5,30 个计分点)
题目编号:22021801CB05 知识点:线段树
编程实现:求个数
题目描述:
给定一组数据,及两个正整数N和M,求出数据中,值位于N到M之内的区间和的个数。
输入描述:
第一行输入一个正整数K(2≤K≤1000)
第二行输入K个正整数(-1000≤正整数≤1000),正整数之间以一个空格隔开
第三行输入两个正整数N和M(-1000≤正整数≤1000),表示区间,正整数之间以一个空格隔开
输出描述:
输出一个整数,表示满足要求的区间和个数
样例输入:
2
-1 3 -2
-1 2
样例输出:
3
评分标准:
5分:能正确输出第一组数据;
5分:能正确输出第二组数据;
5分:能正确输出第三组数据;
5分:能正确输出第四组数据;
5分:能正确输出第五组数据;
5分:能正确输出第六组数据。
#include<iostream>
#include<algorithm>
using namespace std;
const int K = 1000; //维生装备模块数目最大值
const int M = 30; //氧气需要量最大值
const int N = 80; //燃料需要量最大值
const int INF = 100 * K + 1; // 全部装备模块的重量总和
struct Node {
int a; //第i个维生装备模块的氧气容量
int b; //i个维生装备模块的燃料容量
int c; //第i个维生装备模块的重量
} node[K + 1];
int f[M + 1][N + 1]; //f[i][j]表示前t个维生装备模块满足i氧气j燃料的维生装备模块重量最小值
int main() {
int m, n, k; //氧气、燃料、维生装备模块数
cin >> m >> n >> k;
for (int i = 1; i <= k; i++) {
cin >> node[i].a >> node[i].b >> node[i].c;
}
//因为要求最小值,f[][]初始化为很大的正整数
for(int i = 0; i <= m; i++) {
for(int j = 0; j <= n; j++) {
f[i][j] = INF;
}
}
//0氧气0燃料的最小重量是0
f[0][0] = 0;
//01背包,逐个维生装备模块加入
for (int t = 1; t <= k; t++) {
for (int i = m; i >= 0; i--) { //氧气
for (int j = n; j >= 0; j--) { //燃料
//若燃料、氧气含量超过需求,可直接用需求量代换,不影响最优解
int i1 = min(i + node[t].a, m);
int j1 = min(j + node[t].b, n);
f[i1][j1] = min(f[i1][j1], f[i][j] + node[t].c);
}
}
}
cout << f[m][n] << endl;
return 0;
}