1. 空间
小蓝准备用256MB的内存空间开一个数组,数组的每个元素都是32位二进制整数,如果不考虑程序占用的空间和维护内存需要的辅助空间,请问256MB的空间可以存储多少个32位二进制整数?
256 * 1024 * 1024 / 4
2. 卡片
例如,当小蓝有30张卡片,其中0到9各3张,则小蓝可以拼出1到10,但是拼11时卡片1已经只有一张了,不够拼出11。
现在小蓝手里有О到9的卡片各2021张,共20210张,请问小蓝可以从1拼到多少?
#include <iostream>
using namespace std;
int s[10];
bool check(int u) {
while(u) {
int t = u % 10;
u /= 10;
if(-- s[t] < 0) return false;
}
return true;
}
int main()
{
for (int i = 0; i < 10; i ++ ) s[i] = 2021;
for (int i = 1; ; i ++ ) {
if(!check(i)){
cout << i - 1 << endl;
break;
}
}
return 0;
}
3. 直线
给定平面上 20×21个整点{(x,y)[0 ≤x < 20,0 ≤y <21,x ∈ Z,y ∈ Z),即横坐标是О到19(包含0和19)之间的整数、纵坐标是О到20(包含0和20)之间的整数的点。请问这些点一共确定了多少条不同的直线。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 200000;
int n;
// 保存每条直线的斜率 k 与 截距 b 的结构体
struct Line {
double k, b;
// 重写 < 比较规则,调用sort()函数
bool operator< (const Line &t) const {
if(k != t.k) return k < t.k;
return b < t.b;
}
} l[N];
int main()
{
for (int x1 = 0; x1 < 20; x1 ++ )
for (int y1 = 0; y1 < 21; y1 ++ )
for (int x2 = 0; x2 < 20; x2 ++ )
for (int y2 = 0; y2 < 21; y2 ++ )
// 先不计算斜率为 0 的情况 有20条竖线
if (x1 != x2) {
double k = (double)(y1 - y2) / (x1 - x2);
double b = y1 - k * x1;
l[n ++] = {k, b};
}
// 前闭后开
sort(l, l + n);
int res = 1;
for (int i = 1; i < n; i ++ ) {
if(l[i].k - l[i - 1].k > 1e-8 || l[i].b - l[i - 1].b > 1e-8) res ++;
}
cout << res + 20 << endl;
return 0;
}
4. 货物摆放
题目描述
小蓝有一个超大的仓库,可以摆放很多货物。
现在,小蓝有 n 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝
规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、
宽、高。
小蓝希望所有的货物最终摆成一个大的立方体。即在长、宽、高的方向上
分别堆 L、W、H 的货物,满足 n = L × W × H。
给定 n,请问有多少种堆放货物的方案满足要求。
例如,当 n = 4 时,有以下 6 种方案:1×1×4、1×2×2、1×4×1、2×1×2、
2 × 2 × 1、4 × 1 × 1。
请问,当 n = 2021041820210418 (注意有 16 位数字)时,总共有多少种
方案?
#include <iostream>
using namespace std;
typedef long long LL;
int res;
int main()
{
LL n = 2021041820210418 ;
// 暴力枚举 L
for (LL l = 1; l * l * l <= n; l ++)
{
if (n % l == 0)
{
// 暴力枚举 W
for (LL w = l; l * w * w <= n; w ++ )
{
if(n / l % w == 0)
{
// 唯一确定 H
LL h = n / l / w;
if(l == w && w == h) res ++;
else if (l != w && w!= h) res += 6;
else res += 3;
}
}
}
}
cout << res;
return 0;
}
大题1:时间显示
小蓝要和朋友合作开发一个时间显示的网站。
在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从 1970 年 1 月 1 日 00:00:00 到当前时刻经过的毫秒数。
现在,小蓝要在客户端显示出这个时间。
小蓝不用显示出年月日,只需要显示出时分秒即可,毫秒也不用显示,直接舍去即可。
给定一个用整数表示的时间,请将这个时间对应的时分秒输出。
#include <iostream>
using namespace std;
typedef long long LL;
int main()
{
LL n;
cin >> n;
n /= 1000; // 砍去毫秒
n %= 86400;// 一天有 86400 s 求出在最后一天的秒数
int hh = n / 3600; // 小时
n %= 3600;
int mm = n / 60; // 分钟
int ss = n % 60; // 秒数
printf("%02d:%02d:%02d", hh, mm, ss);
return 0;
}
砝码称重
你有一架天平和 N 个砝码,这 N 个砝码重量依次是 W1,W2,⋅⋅⋅,WN。
请你计算一共可以称出多少种不同的正整数重量?
注意砝码可以放在天平两边。
输入格式
输入的第一行包含一个整数 N。
第二行包含 N 个整数:W1,W2,W3,⋅⋅⋅,WN。
输出格式
输出一个整数代表答案。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 10010;
int n;
int w[N];
int f[N][N];
int sum;
int res;
int main() {
cin >> n;
for (int i = 1; i <= n; i ++ ) {
cin >> w[i];
sum += w[i];
}
f[0][0] = 1;
for (int i = 1; i <= n; i ++ ) {
for (int j = 0; j <= sum; j ++ ) {
f[i][j] = f[i - 1][j] || f[i - 1][j + w[i]] || f[i - 1][abs(j - w[i])];
}
}
for (int i = 1; i <= sum; i ++ )
if(f[n][i] > 0) res ++;
cout << res;
return 0;
}