第十二届蓝桥杯大赛 大学 B 组 C/C++ 个人题解

2021/4/19 22:25:51

本文主要是介绍第十二届蓝桥杯大赛 大学 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\)) 之间的整数的点。

请问这些点一共确定了多少条不同的直线。



这篇关于第十二届蓝桥杯大赛 大学 B 组 C/C++ 个人题解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程