蓝桥杯 2021年省赛真题 (C/C++ 大学B组 )
最近在备考专升本
解析移步对应 Java组 的题解。
#A 空间
本题总分: 5 5 5 分
问题描述
小蓝准备用 256 M B 256\mathrm{MB} 256MB 的内存空间开一个数组,数组的每个元素都是 32 32 32 位二进制整数,如果不考虑程序占用的空间和维护内存需要的辅助空间,请问 256 M B 256\mathrm{MB} 256MB 的空间可以存储多少个 32 32 32 位二进制整数?
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
67108864
calcCode:
#include <stdio.h>
int main() {
printf("%d", 256 >> 2 << 20);
}
checkCode:
#include <stdio.h>
#include <math.h>
int A[67108864];
int main() {
printf("%f", sizeof A / pow(2, 20));
}
虽然 sizeof
是在编译阶段进行的,
从这个意义上看并不是什么非要支持不可的函数。
但 C \mathrm{C} C,行!
#B 卡片
本题总分: 5 5 5 分
问题描述
小蓝有很多数字卡片,每张卡片上都是数字 0 0 0 到 9 9 9。
小蓝准备用这些卡片来拼一些数,他想从 1 1 1 开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。
小蓝想知道自己能从 1 1 1 拼到多少。
例如,当小蓝有 30 30 30 张卡片,其中 0 0 0 到 9 9 9 各 3 3 3 张,则小蓝可以拼出 1 1 1 到 10 10 10,但是拼 11 11 11 时卡片 1 1 1 已经只有一张了,不够拼出 11 11 11。
现在小蓝手里有 0 0 0 到 9 9 9 的卡片各 2021 2021 2021 张,共 20210 20210 20210 张,请问小蓝可以从 1 1 1 拼到多少?
提示:建议使用计算机编程解决问题。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
3181
calcCode:
#include <stdio.h>
int n, ans, cnt;
int main() {
while (1) {
n = ans;
while (n) {
if (n % 10 == 1) cnt++;
n /= 10;
}
if (cnt < 2021) ans++;
else break;
}
printf("%d", ans);
}
#C 直线
本题总分: 10 10 10 分
问题描述
在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上,那么这些点中任意两点确定的直线是同一条。
给定平面上 2 × 3 2 × 3 2×3 个整点 { ( x , y ) ∣ 0 ≤ x < 2 , 0 ≤ y < 3 , x ∈ Z , y ∈ Z } \{(x, y)|0 ≤ x < 2, 0 ≤ y < 3, x ∈ Z, y ∈ Z\} {
(x,y)∣0≤x<2,0≤y<3,x∈Z,y∈Z},即横坐标是 0 0 0 到 1 1 1 (包含 0 0 0 和 1 1 1) 之间的整数、纵坐标是 0 0 0 到 2 2 2 (包含 0 0 0 和 2 2 2) 之间的整数的点。这些点一共确定了 11 11 11 条不同的直线。
给定平面上 20 × 21 20 × 21 20×21 个整点 { ( x , y ) ∣ 0 ≤ x < 20 , 0 ≤ y < 21 , x ∈ Z , y ∈ Z } \{(x, y)|0 ≤ x < 20, 0 ≤ y < 21, x ∈ Z, y ∈ Z\} {
(x,y)∣0≤x<20,0≤y<21,x∈Z,y∈Z},即横坐标是 0 0 0 到 19 19 19 (包含 0 0 0 和 19 19 19) 之间的整数、纵坐标是 0 0 0 到 20 20 20 (包含 0 0 0 和 20 20 20) 之间的整数的点。请问这些点一共确定了多少条不同的直线。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
40257
calcCode:
#include <stdio.h>
const int X = 20, Y = 21;
int linked[X][Y][X][Y], ans;
int main() {
for (int x1 = 0; x1 < X; x1++)
for (int y1 = 0; y1 < Y; ++y1) {
linked[x1][y1][x1][y1] = 1;
for (int x2 = 0; x2 < X; ++x2)
for (int y2 = 0; y2 < Y; ++y2)
if (!linked[x1][y1][x2][y2]) {
int x = x1, x_offset = x1 - x2;
int y = y1, y_offset = y1 - y2;
while (x >= 0 && x < X && y >= 0 && y < Y) x -= x_offset, y -= y_offset;
for (x += x_offset, y += y_offset; x >= 0 && x < X && y >= 0 && y < Y; x += x_offset, y += y_offset)
for (int xx = x, yy = y; xx >= 0 && xx < X && yy >= 0 && yy < Y; xx += x_offset, yy += y_offset)
linked[x][y][xx][yy] = linked[xx][yy][x][y] = 1;
ans++;
}
}
printf("%d", ans);
}
#D 货物摆放
本题总分: 10 10 10 分
问题描述
小蓝有一个超大的仓库,可以摆放很多货物。
现在,小蓝有 n n n 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。
小蓝希望所有的货物最终摆成一个大的立方体。即在长、宽、高的方向上分别堆 L 、 W 、 H L、W、H L、W、H 的货物,满足 n = L × W × H n = L × W × H n=L×W×H。
给定 n n n,请问有多少种堆放货物的方案满足要求。
例如,当 n = 4 n = 4 n=4 时,有以下 6 6 6 种方案: 1 × 1 × 4 1×1×4 1×1×