青少年软件编程(C语言)等级考试试卷(
五
级)
1、
结绳
给定一段一段的绳子,你需要把它们串成一条绳。每次串连的时候,是把两段绳子对折,再如下图所示套接在一起。这样得到的绳子又被当成是另一段绳子,可以再次对折去跟另一段绳子串连。每次串连后,原来两段绳子的长度就会减半。
给定 n 段绳子的长度,你需要找出它们能串成的绳子的最大长度。
时间限制:1000
内存限制:65536
输入
每个输入包含 1 个测试用例。每个测试用例第 1 行给出正整数 n (2 ≤ n ≤ 10
4
);第 2 行给出 n 个正整数,即原始绳段的长度,数字间以空格分隔。所有整数都不超过10
4
。
输出
在一行中输出能够串成的绳子的最大长度。结果向下取整,即取为不超过最大长度的最近整数。
样例输入
8
10 15 12 3 4 13 1 15
样例输出
14
参考代码:
#include <iostream>
#include <queue>
using namespace std;
int main() {
int n; cin >> n;
priority_queue<int, vector<int>, greater<int>> pq;
for (int i = 0, len; i < n; ++i) { cin >> len; pq.push(len); }
int total = 0;
while (pq.size() > 1) {
int a = pq.top(); pq.pop();
int b = pq.top(); pq.pop();
int newLen = (a + b) / 2;
total += newLen;
pq.push(newLen);
}
cout << total;
}
2、
从A到B
我们来做一个数字游戏,通过一系列操作把一个数字 A 变成另一个数字 B。设当前数字是 X,规定每次操作可以从以下 3 种里面选一种进行:
- X = X + 1
- X = X - 1
- X = X × N
你的任务就是求出从 A 变成 B 至少需要多少步。
时间限制:1000
内存限制:65536
输入
每组输入包含多个测试用例。先给出一个整数 K(≤ 10),为测试用例的个数。随后 K 行,每行给出一个测试用例的三个整数:A、B、N,其中 -10
5
≤ A, B ≤ 10
5
,1 < N < 10。同行数字间以空格分隔。
输出
对每个测试用例,在一行中输出从 A 变成 B 至少需要多少步。
样例输入
3
3 11 2
-5 -12 3
-2 1000 7
样例输出
3
2
13
提示
样例解释: 第 1 组:(3 × 2 × 2)-1=11 第 2 组:(-5+1) × 3 = -12 第 3 组:(((-2+1+1+1+1+1)×7-1)×7+1+1+1)×7-1 = 1000
参考代码:
#include <iostream>
#include <queue>
#include <unordered_map>
using namespace std;
int bfs(int A, int B, int N) {
unordered_map<int, int> dist = {{A, 0}};
queue<int> q = {A};
whil
202503C语言五级