小蓝准备用 \(256MB\) 的内存空间开一个数组,数组的每个元素都是 \(32\) 位二进制整数,如果不考虑程序占用的空间和维护内存需要的辅助空间,请问 \(256MB\) 的空间可以存储多少个 \(32\) 位二进制整数?
\(256MB=256*2^{10}KB=256*2^{20}B=256*8*2^{20}Bit=2147483648Bit\)
\(2147483648Bit/32=67108864\)
小蓝有很多数字卡片,每张卡片上都是数字 \(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; }
在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上,那么这些点中任意两点确定的直线是同一条。
给定平面上 \(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\)) 之间的整数的点。
请问这些点一共确定了多少条不同的直线。