STEM考试 C++组(3)
一、选择题
第一题(难度系数 2)
题目编号:22112701CX01 知识点考察:运算符
执行cout<<5/3;语句后,输出的结果是( )。
*选择题严禁使用程序验证,选择题不答和答错不扣分
A、0 B、1 C、2 D、3
第二题(难度系数 2)
题目编号:22112701CX02 知识点:一维数组
执行以下代码,输出的结果是( )。
char a[6] = {'a','b','c','d'};
cout << sizeof(a);
*选择题严禁使用程序验证,选择题不答和答错不扣分
A、4 B、6 C、8 D、12
第三题(难度系数 2)
题目编号:22112701CX03 知识点:一维数组
关于C++中的一维数组,以下描述正确的是( )。
*选择题严禁使用程序验证,选择题不答和答错不扣分
- 数组中的元素类型可以不相同
- 数组在内存中占有一段连续的存储单元
- 数组中的最后一个元素的下标(索引)为-1
- 静态数组中元素的个数可以大于数组初始时设定的长度
第四题(难度系数 3)
题目编号:22112701CX04 知识点:while 与 do...while
以下关于while与do...while循环语句描述不正确的是( )。
*选择题严禁使用程序验证,选择题不答和答错不扣分
A、do...while的循环条件可以是1
B、while的循环体可以是复合语句
C、do...while的循环体至少执行一次
D、执行do...while语句,首先判断循环条件,当满足循环条件,开始执行循环体中的语句
第五题(难度系数 4)
题目编号:22112701CX05 知识点:函数返回值
以下关于函数的返回值类型和返回值表达式类型的描述不正确的是 ( ) 。
*选择题严禁使用程序验证,选择题不答和答错不扣分
A、函数的返回值类型就是返回值表达式的类型
B、函数的返回值类型决定返回值表达式的类型
C、函数返回值的类型是在定义函数时确定的,函数调用时是不能改变的
D、函数返回值类型与返回值表达式类型不同时,返回值表达式类型会转换为函数返回值类型
二、编程题
第一题(难度系数2,15 个计分点)
题目编号:22112701CB01 知识点:运算符
编程实现:切割蛋糕
题目描述:
有一块矩形蛋糕,小明从蛋糕的正上方横向和纵向各切N刀(1<N<100),每刀互不重合。计算出蛋糕被切割成了几块。
例如:N = 2,蛋糕被切割成9块。
输入描述:输入一个正整数N(1<N<100),表示蛋糕被横向和纵向各切割的刀数
输出描述:输出一个整数,表示蛋糕最后被切割成了几块
样例输入:2
样例输出:9
评分标准:
3分:能正确输出第一组数据;
3分:能正确输出第二组数据;
3分:能正确输出第三组数据;
3分:能正确输出第四组数据;
3分:能正确输出第五组数据。
测试用例:
输入 | 1 | 5 | 21 | 68 | 98 |
输出 | 4 | 36 | 484 | 4761 | 9801 |
#include<iostream>
using namespace std;
int main() {
int n, m;
cin >> n;
m = (n + 1) * (n + 1);
cout << m;
return 0;
}
第二题(难度系数 3,18 个计分点)
题目编号:22112701CB02 知识点:判断
编程实现:拼写单词
题目描述:
四种水果的英文单词,分别为Apple、Banana、Orange、Pear。老师通过提示每个单词的首字母,让同学将对应的单词拼写下来。
请编写程序:
当输入的大写字母为“A”时,则输出“Apple”;
当输入的大写字母为“B”时,则输出“Banana”;
当输入的大写字母为“O”时,则输出“Orange”;
当输入的大写字母为“P”时,则输出“Pear”。
输入描述:输入A、B、O、P中任意一个大写字母
输出描述:输出一个字符串,表示大写字母对应的英文单词(单词首字母大写)
样例输入:A
样例输出:Apple
评分标准:
4分:能正确输出第一组数据;
4分:能正确输出第二组数据;
5分:能正确输出第三组数据;
5分:能正确输出第四组数据。
测试用例:
输入 | B | O | P | A |
输出 | Banana | Orange | Pear | Apple |
#include<iostream>
using namespace std;
int main()
{
char c;
cin >> c;
if(c == 'A'){
cout << "Apple";
}
if(c == 'B'){
cout << "Banana";
}
if(c == 'O'){
cout << "Orange";
}
if(c == 'P'){
cout << "Pear";
}
return 0;
}
第三题(难度系数 3,20 个计分点)
题目编号:22112701CB03 知识点:循环 判断
编程实现:业务办理时间
题目描述:
某服务大厅同时开放3个窗口为客户办理业务,窗口编号分别为1、2、3。
现有N(2≤N≤50)位客户需要办理业务,客户编号为1~N,作为办理业务的先后顺序。
起初三个窗口为空闲状态,空闲的窗口会按照客户编号顺序呼叫下一位客户。如果多个窗口同时为空闲状态,按照窗口编号顺序呼叫(1优先于2,2优先于3)。
现给出每位客户办理业务的时间(单位:分钟),请计算出N位客户全部办理完业务后,哪一个窗口合计办理业务的时间最短,并输出最短时间。
例如:N=7,7位客户编号分别为1、2、3、4、5、6、7,客户办理业务时间分别为3、5、2、4、7、1、6,(如下图):
初始客户编号为1、2、3的客户分别在1、2、3窗口同时办理业务;
窗口3用时2分钟办理完3号客户的业务,变为空闲状态,并按顺序呼叫4号客户,用时4分钟;
窗口1用时3分钟办理完1号客户的业务,变为空闲状态,并按顺序呼叫5号客户,用时7分钟;
窗口2用时5分钟办理完2号客户的业务,变为空闲状态,并按顺序呼叫6号客户,用时1分钟;
6分钟后,窗口2和3同时变为空闲状态,窗口2呼叫7号客户,用时6分钟。
全部客户办理完业务后,三个窗口总用时分别为10分钟、12分钟、6分钟,用时最短的是窗口3,最短时间为6分钟。
输入描述:
第一行输入一个正整数N(2≤N≤50),表示办理业务的客户数
第二行输入N个正整数(1≤正整数≤50),依次表示每位客户办理业务的时间,正整数之间以一个空格隔开
输出描述:
输出一个整数,表示客户全部办理完业务,用时最短的窗口所用时间
样例输入:
7
3 5 2 4 7 1 6
样例输出:
6
评分标准:
3分:能正确输出第一组数据;
3分:能正确输出第二组数据;
3分:能正确输出第三组数据;
3分:能正确输出第四组数据;
3分:能正确输出第五组数据;
5分:能正确输出第六组数据。
测试用例:
输入 | 6 3 5 2 2 7 1 | 7 9 5 15 17 11 13 14 | 10 6 5 9 3 1 18 15 11 14 12 | 12 13 8 5 2 18 4 14 7 17 20 16 12 |
输出 | 5 | 22 | 25 | 42 |
输入 | 12 13 17 6 20 1 11 5 8 15 12 2 19 | 22 12 34 22 12 3 5 7 27 38 2 9 11 23 45 23 12 19 20 24 1 2 43 | ||
输出 | 38 | 113 |
#include<bits/stdc++.h>
using namespace std;
int N,ans;
priority_queue< int,vector<int>,greater<int> >q; //优先队列,小根堆
int main(){
cin>>N;
for(int i=0;i<N;i++){
int x;
cin>>x;
if(q.size()<3){
q.push(x);
}
else{
int t=q.top();
t+=x;
q.pop();
q.push(t);
}
}
cout<<q.top();
return 0;
}
第四题(难度系数4,25个计分点)
题目编号:22112701CB04 知识点:递归 递推 搜索
编程实现:找路线
题目描述:
现有22名小朋友,依次编号1到22,22名小朋友分别按照下图的位置站好。
每名小朋友只能按照图中箭头指向的方向移动。给出两名小朋友的编号N和M(1≤N<M≤22),请你找出从编号N到编号M共有多少条不同的路线。
例如:N=3,M=7,从编号3的位置到编号7的位置共有5条路线,分别为:(3->5->7),(3->5->6->7),(3->4->5->7),(3->4->5->6->7),(3->4>6->7)。
输入描述:输入两个正整数N和M(1≤N<M≤22),分别表示两名小朋友的编号,之间以一个空格隔开
输出描述:输出一个整数,表示从编号N到编号M共有多少条不同的路线
样例输入:
3 7
样例输出:
5
评分标准:
4分:能正确输出第一组数据;
4分:能正确输出第二组数据;
4分:能正确输出第三组数据;
4分:能正确输出第四组数据;
4分:能正确输出第五组数据;
5分:能正确输出第六组数据。
测试用例:
输入 | 1 2 | 3 6 | 7 17 | 12 20 | 6 18 | 1 22 |
输出 | 1 | 3 | 89 | 34 | 233 | 17711 |
#include<bits/stdc++.h>
using namespace std;
int N,M;
int F[30]; //从1(+x)到i(+x)的方法数
int main(){
cin>>N>>M;
F[1]=1,F[2]=1;
for(int i=3;i<=M;i++){
F[i]=F[i-1]+F[i-2];
}
cout<<F[M-N+1]; //从N到M,有M-N+1个点
return 0;
}
第五题(难度系数 5,30 个计分点)
题目编号:22112701CB05 知识点:动态规划
编程实现:最大乘积
题目描述:
小明有N(4≤N≤60)个玻璃球,他想将N个玻璃球拆分成若干份(份数≥2),且每份中的数量互不相等。
小明想知道如何拆分可以使每份玻璃球数量的乘积最大。请你编写程序帮助小明计算出最大乘积是多少。
例如:N = 5,
5个玻璃球有2种符合条件的拆分方法:(4,1)、(3,2);
其中,能得到最大乘积的拆分方法为(3,2),最大乘积为6(6=3*2)。
输入描述:输入一个正整数N(4≤N≤60),表示玻璃球的总数量
输出描述:输出一个整数,表示最大乘积
样例输入:5
样例输出:6
评分标准:
5分:能正确输出第一组数据;
5分:能正确输出第二组数据;
5分:能正确输出第三组数据;
5分:能正确输出第四组数据;
5分:能正确输出第五组数据;
5分:能正确输出第六组数据。
测试用例:
输入 | 8 | 13 | 22 | 39 | 48 | 59 |
输出 | 15 | 72 | 1008 | 72576 | 604800 | 6652800 |
#include<bits/stdc++.h>
using namespace std;
int N,sum,MaxM;
int a[100],vis[100];
void DFS(int k){ //搜索,回溯
if(sum>N) return;
for(int i=1;i<N;i++){
if(vis[i]==0 && i>a[k-1]){
a[k]=i;
sum+=i;
vis[i]=1;
if(sum==N){
int M=1;
for(int j=1;j<=k;j++) M*=a[j];
MaxM=max(MaxM,M);
}else{
DFS(k+1);
}
sum-=i;
vis[i]=0;
}
}
}
int main(){
cin>>N;
DFS(1);
cout<<MaxM<<endl;
return 0;
}
另一种解法:
#include<bits/stdc++.h>
using namespace std;
int n;
int ans=0;
//深搜he为所有部分的和,ji为所有部分乘积,start为最小可以取的数
void dfs(int he,int ji,int start){
if (he==n){//如果和等于n,求乘积的最大值
ans=max(ans,ji);
}
//枚举最小可以取的数到最大可以取的数,深搜一遍
for(int i=start;i+he<=n;i++){
dfs(he+i,ji*i,i+1);
}
}
int main() {
cin>>n;
dfs(0,1,1);
cout<<ans;
return 0;
}