第十二届蓝桥杯大赛 大学 B 组 C/C++ 个人题解
作者:互联网
赛情
A: 空间
问题描述
小蓝准备用 \(256MB\) 的内存空间开一个数组,数组的每个元素都是 \(32\) 位二进制整数,如果不考虑程序占用的空间和维护内存需要的辅助空间,请问 \(256MB\) 的空间可以存储多少个 \(32\) 位二进制整数?
解答(67108864)
\(256MB=256*2^{10}KB=256*2^{20}B=256*8*2^{20}Bit=2147483648Bit\)
\(2147483648Bit/32=67108864\)
B: 卡片
问题描述
小蓝有很多数字卡片,每张卡片上都是数字 \(0\) 到 \(9\)。
小蓝准备用这些卡片来拼一些数,他想从 \(1\) 开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。
小蓝想知道自己能从 \(1\) 拼到多少。
例如,当小蓝有 \(30\) 张卡片,其中 \(0\) 到 \(9\) 各 \(3\) 张,则小蓝可以拼出 \(1\) 到 \(10\),但是拼 \(11\) 时卡片 \(1\) 已经只有一张了,不够拼出 \(11\)。
现在小蓝手里有 \(0\) 到 \(9\) 的卡片各 \(2021\) 张,共 \(20210\) 张,请问小蓝可以从 \(1\) 拼到多少?
提示:建议使用计算机编程解决问题。
解答
使用 \(cnt[]\) 数组记录手上剩余的不同数字的卡片数,用 while 循环迭代每一个待拼的数,按位拆分后依次在 \(cnt\) 减去
当发现 \(cnt[i]\) 数量不足时,说明当前数字无法拼出,跳出循环,答案为前一个拼好的数字
代码如下
#include <bits/stdc++.h>
using namespace std;
int cnt[11],c=0;
bool fl=false;
int main() {
for (int i=0;i<=9;i++) cnt[i]=2021;
while (!fl && ++c) {
int t=c;
while (t) cnt[t%10]--,t/=10;
for (int i=0;i<=9;i++)
if (cnt[i]<0) { fl=true; break; }
}
printf("%d",c-1);
return 0;
}
C: 直线
问题描述
在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上,那么这些点中任意两点确定的直线是同一条。
给定平面上 \(2 × 3\) 个整点 \({(x, y) | 0 ≤ x < 2, 0 ≤ y < 3, x ∈ Z, y ∈ Z}\),即横坐标是 \(0\) 到 \(1\) (包含 \(0\) 和 \(1\)) 之间的整数、纵坐标是 \(0\) 到 \(2\) (包含 \(0\) 和 \(2\)) 之间的整数的点。
这些点一共确定了 \(11\) 条不同的直线。
给定平面上 \(20 × 21\) 个整点 \({(x, y) | 0 ≤ x < 20, 0 ≤ y < 21, x ∈ Z, y ∈ Z}\),即横坐标是 \(0\) 到 \(19\) (包含 \(0\) 和 \(19\)) 之间的整数、纵坐标是 \(0\) 到 \(20\) (包含 \(0\) 和 \(20\)) 之间的整数的点。
请问这些点一共确定了多少条不同的直线。
标签:11,直线,cnt,20,卡片,题解,C++,蓝桥,小蓝 来源: https://www.cnblogs.com/zhwer/p/14678817.html