STEMA-C++
省202510
省202509
国202506
省202505
本文档使用 MrDoc 发布
-
+
首页
省202510
# STEMA考试 C++试卷(10月) ## 一、单项选择题 ### 第一题下列选项中,无法使变量 a 的值增加 1 的是( D)。 A、`a++;` B、`a += 1;` C、`a = a + 1;` D、`a + 1;` ### 第二题运行以下程序,输出的结果是(B )。 ```cpp int a = 3, b = 5; if (a > b) { cout << "E"; } if (a + b >= 8){ cout << "F"; } ``` A、E B、F C、EF D、FE ### 第三题定义变量 `int a, b, c;` 下列选项中,与表达式语句 `a = b = c + 1;` 等价的是(D )。 A、`a = (b = c) + 1;` B、`(a = b) = c + 1`; C、`a = b, b = c + 1`; D、`b = c + 1, a = b`; ### 第四题运行以下程序,输出的结果是(D )。 ```cpp int arr[3][3] = { {14, 41, 36}, {25, 54, 45}, {16, 91, 83}}; int sum = 0; for (int i = 0; i < 3; i++) { int tmp = arr[i][i]; sum += (tmp % 2 == 0 ? tmp : -tmp); } cout << sum; ``` A、15 B、151 C、106 D、-15 ### 第五题观察以下程序,如果想要比较 str1 和 str2 的内容是否相同,下列横线处应该填写( A)。 ```cpp char str1[20], str2[20]; cin >> str1 >> str2; if (_______________) { cout << "str1 == str2"; } else { cout << "str1 != str2"; } ``` A、`strcmp(str1, str2) = = 0 ` B、`str1 = = str2` C、`str1.compare(str2) = = 0` D、`str2 - str1 = = 0` ## 二、编程题 ### 第一题 **标题:**兑换卡牌 **题目描述:**小蓝在玩一款卡牌类游戏。其中 1 张史诗卡牌可以兑换 8 张传说卡牌,小蓝的游戏背包中共有 n 张史诗卡牌,请计算他最多能兑换多少张传说卡牌。输入描述:输入一个整数 `n(1≤n≤500)`,表示史诗卡牌的数量。输出描述:输出一个整数,表示最多能兑换的传说卡牌的数量。 **输入描述:** 输入一个整数 n(1≤n≤500),表示史诗卡牌的数量。 **输出描述:**输出一个整数,表示最多能兑换的传说卡牌的数量。 **样例输入:**3 **样例输出:**24 ```cpp #include <iostream> using namespace std; int main() { int n; cin>>n; int s = n*8; cout<<s<<endl; } ``` ### 第二题 **标题:**图书馆借阅费用 **题目描述:**小蓝家附近有一个图书馆,图书馆的借阅收费标准如下: 1、借阅天数在 5 天以内(包括 5 天),每天收费 2 元; 2、超过 5 天的部分,每天收费 1 元。小蓝从图书馆借了一本书,共借阅了 n 天,请计算他需要支付的总费用。 例如:n = 10,借阅 10 天的费用计算为:前 5 天费用 = 5 × 2 = 10 元,后 5 天费用 = 5 × 1 = 5元,总费用 = 10 + 5 = 15 元。 **输入描述:**输入一个整数 n(1≤n≤30),表示借阅的天数。 **输出描述**:输出一个整数,表示需要支付的总费用。 **样例输入:** 10 **样例输出:** 15 ```cpp #include <iostream> using namespace std; int main() { int n; cin>>n; int s = 0; if(n>=5) { s = n*2; } else { s = 10+(n-5); } cout<<s<<endl; } ``` ### 第三题 **标题:**整数挑战 **题目描述:**给定一排共 5 个整数,请按照以下规则,计算并输出 5 个新整数: - 两端位置(从左数第 1 个、第 5 个位置): -- 新整数 = (初始整数 + 唯一相邻整数)÷ 2; - 中间位置(从左数第 2 个、第 3 个、第 4 个位置): -- 新整数 = (初始整数 + 左右相邻两个整数的和)÷ 3。 - 计算结果只保留整数部分。 例如:初始整数为 3、5、7、2、4, 按照规则计算过程如下: 第 1 个位置:(3 + 5)÷ 2 = 4; 第 2 个位置:(5 + 3 + 7)÷ 3 = 5; 第 3 个位置:(7 + 5 + 2)÷ 3 = 4(仅保留整数部分); 第 4 个位置:(2 + 7 + 4)÷ 3 = 4(仅保留整数部分); 第 5 个位置:(4 + 2)÷ 2 = 3; 计算后的新整数为 4、5、4、4、3。 **输入描述:**输入五个整数(1≤整数≤10),表示初始整数,整数之间以一个空格隔开。 **输出描述:**输出五个整数,表示计算后的新整数,整数之间以一个空格隔开。 **样例输入:**3 5 7 2 4 **样例输出:**4 5 4 4 ```cpp #include <iostream> using namespace std; const int N = 5; int a[N],b[N]; int main() { int n; for(int i = 0;i < N;i++) { cin>>a[i]; } for(int i = 0;i < N;i++) { if(i == 0) { b[i] = (a[i]+a[i+1])/2; } else if(i == N-1) { b[i] = (a[i]+a[i-1])/2; } else { b[i] = (a[i-1]+a[i]+a[i+1])/3; } } for(int i = 0;i < N;i++) { cout<<b[i]<<" "; } } ``` ### 第四题 **标题:**树枝上的蚂蚁 **题目描述:**一根水平的树枝,长为 d 厘米,树枝上有 n 只蚂蚁。将树枝的左端看做起点,其中第 i 只蚂蚁的初始位置到起点的距离为 xi 厘米。每只蚂蚁的初始朝向为左或右,所有蚂蚁同时以 1 厘米/秒的速度朝初始方向移动,越过树枝两端的蚂蚁会离开树枝(恰好处于树枝两端的蚂蚁不算离开树枝),请计算 T 秒后树枝上还有多少只蚂蚁。 例如:d = 10,n = 3,这 3 只蚂蚁的初始位置到起点的距离分别为 2、5、8 厘米,它们的初始朝向分别为左、右、左。如下图所示:  当 T = 4 时,4 秒后,第 1 只蚂蚁会离开树枝,第 2 只蚂蚁和第 3 只蚂蚁到起点的距离分别是 9 和 4厘米。 如下图所示:  故 4 秒后,树枝上还有 2 只蚂蚁。 **输入描述:** 第一行输入三个整数 d,n 和 T(1≤d≤10000,1≤n≤min(d+1, 100),1≤T≤10000),分别表示树枝的长度,蚂蚁的数量以及时间; 第二行输入 n 个不同的整数 xi(0≤xi≤d),分别表示每只蚂蚁的初始位置到起点的距离; 第三行输入 n 个整数(整数为 0 或 1),分别表示每只蚂蚁的初始朝向,0 表示初始朝向左,1 表示初始朝向右;同一行数据之间以一个空格隔开。 **输出描述:**输出一个整数,表示 T 秒后树枝上的蚂蚁数量。 样例输入: 10 3 4 2 5 8 0 1 0 **样例输出**:2 ```cpp #include <iostream> using namespace std; const int N = 10000; int a[N]; int main() { int d,n,t; int f; int cnt = 0; cin>>d>>n>>t; for(int i = 0;i < d;i++) { cin>>a[i]; } for(int i = 0;i < n;i++) { cin>>f; if(f == 0) { a[i] -= t; } else { a[i] += t; } if(a[i]>=0 && a[i]<=d) { cnt++; } } cout<<cnt<<endl; } ``` ### 第五题 **标题:**汉明距离 **提示信息:**汉明距离:两个长度相同的字符串对应位置的字符不相同的数量。例如:字符串 S = "1011010",T = "1010110",其中 S 和 T 的第 4、5 个位置的字符不相同,则 S 和T 的汉明距离为 2。 **题目描述:**给定两个长度均为 n 的二进制序列 S 和 T,你可以改变 S 中任意位置的数字(如果该位置是 0,将其变为 1,否则将其变为 0)。改变 S 中的第 i 位数字,其代价是 Ci。请你通过改变 S 中若干位置的数字,使得 S 和 T 的汉明距离恰好为 K,并计算最小总代价是多少。 例如:n = 5,S = "10010",T = "01111";改变 S 的每一位的代价分别为:1、4、9、8、5;K = 1。初始 S 和 T 的汉明距离为 4(第 1、2、3、5 位数字均不相同)。要使得 S 和 T 的汉明距离变为 1,且总代价最小,选择改变 S 的第 1、2、5 位。总代价为 10(1 + 4 + 5)。 **输入描述:** 第一行输入一个整数 n(1≤n≤1000),表示二进制序列的长度; 第二行和第三行各输入一个二进制序列(仅包含 0 和 1),分别表示序列 S 和序列 T; 第四行输入 n 个整数 Ci(1≤Ci≤5000),表示改变序列 S 的第 i 位的代价,整数之间以一个空格隔开; 第五行输入一个整数 K(0≤K≤n)。 **输出描述:**输出一个整数,表示使得 S 和 T 的汉明距离恰好为 K 的最小总代价。 样例输入: 5 10010 01111 1 4 9 8 5 1 **样例输出:**10 ```cpp #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 100; char a[N+1],b[N+1]; int c[N+1],d[N+1]; int main() { int n; cin>>n; // 输入第一行 cin>>a; // 输入第二行 cin>>b; // 输入第三行 // 输入第四行 for(int i = 0;i < n;i++) { cin>>c[i]; } int k; cin>>k; // 输入第五行 int length = 0; // 统计汉明距离 for(int i = 0;i < n;i ++) { if(a[i] != b[i]) { d[length] = c[i]; // 有效代价记录下来 length++; } } sort(d,d+length);// 有效代价排序 int s = 0; for(int i =0;i < length-k;i ++) { s+=d[i]; } cout<<s<<endl; } ```
admin
2025年12月4日 15:15
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码