2021年B组第1场真题
Posted 揭航
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021年B组第1场真题相关的知识,希望对你有一定的参考价值。
2021年B组真题
2021-04-18
2021年第十二届蓝桥杯省赛第一场(4月18日)
A: 空间
【问题描述】
小蓝准备用 256MB 的内存空间开一个数组,数组的每个元素都是 32 位
二进制整数,如果不考虑程序占用的空间和维护内存需要的辅助空间,请问
256MB 的空间可以存储多少个 32 位二进制整数?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
256 * 2^20 / 4
B_卡片
【问题描述】
小蓝有很多数字卡片,每张卡片上都是数字 0 到 9。
小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个,
就保存起来,卡片就不能用来拼其它数了。
小蓝想知道自己能从 1 拼到多少。
例如,当小蓝有 30 张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10,
但是拼 11 时卡片 1 已经只有一张了,不够拼出 11。
现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 1
拼到多少?
提示:建议使用计算机编程解决问题。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
#include <iostream>
#include <cstdio>
using namespace std;
int res;
int cnts[10];
bool check(int x) {
while (x) {
int tmp = x % 10;
if (cnts[tmp] >= 1) {
cnts[tmp]--;
} else {
return false;
}
x /= 10;
}
return true;
}
int main()
{
for (int i = 0; i < 10; ++i) {
cnts[i] = 2021;
}
for (int i = 1; i < 99999; ++i) {
if (check(i)) {
++res;
} else {
break;
}
}
printf("%d\\n", res); // 3181
return 0;
}
C: 直线
【问题描述】
在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上,
那么这些点中任意两点确定的直线是同一条。
给定平面上 2 × 3 个整点 f(x; y)j0 ≤ x < 2; 0 ≤ y < 3; x 2 Z; y 2 Zg,即横坐标
是 0 到 1 (包含 0 和 1) 之间的整数、纵坐标是 0 到 2 (包含 0 和 2) 之间的整数
的点。这些点一共确定了 11 条不同的直线。
给定平面上 20 × 21 个整点 f(x; y)j0 ≤ x < 20; 0 ≤ y < 21; x 2 Z; y 2 Zg,即横
坐标是 0 到 19 (包含 0 和 19) 之间的整数、纵坐标是 0 到 20 (包含 0 和 20) 之
间的整数的点。请问这些点一共确定了多少条不同的直线。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
用结构体
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 200000 + 5;
struct Line {
double k;
double b;
bool operator < (const Line &t) const {
if (k != t.k) {
return k < t.k;
}
return b < t.b;
}
}line[N];
int cnt;
int main() {
for (int x1 = 0; x1 <= 19; ++x1) {
for (int y1 = 0; y1 <= 20; ++y1) {
for (int x2 = 0; x2 <= 19; ++x2) {
for (int y2 = 0; y2 <= 20; ++y2) {
if (x1 != x2) {
double k = (double)(y2 - y1) / (double)(x2 - x1);
double b = y1 - k * x1;
line[cnt++] = {k, b};
}
}
}
}
}
int res = 1; // 因为数的的是间隔
sort(line, line + cnt);
for (int i = 0; i < cnt - 1; ++i) {
if (fabs(line[i].k - line[i + 1].k) > 1e-8 || fabs(line[i].b - line[i + 1].b) > 1e-8) {
res++;
}
}
cout << res + 20 << "\\n";// 还有20条斜率不存在的直线
return 0;
}
string
#include <cstdio>
#include <iostream>
#include <set>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <unordered_set>
using namespace std;
int n, m;
const int N = 1e4 + 5;
typedef pair<double, double> PDD;
typedef pair<string, string> PSS;
set<PSS> se;
vector<Node> ve;
string int2str(int x) {
string ans = "";
if (x < 0) {
ans = ans + '-';
x = -x;
}
while(x) {
int tmp = x % 10;
char ch = tmp + '0';
ans = ans + ch;
x /= 10;
}
return ans;
}
int main() {
scanf("%d%d", &n, &m);
for (int x1 = 0; x1 <= n; ++x1) {
for (int y1 = 0; y1 <= m; ++y1) {
for (int x2 = 0; x2 <= n; ++x2) {
for (int y2 = 0; y2 <= m; ++y2) {
if (x1 == x2) {
continue;
}
if (y1 == y2) {
continue;
}
int y = y2 - y1;
int x = x2 - x1;
int g1 = __gcd(x, y);
x /= g1;
y /= g1;
string ch_x = int2str(x);
string ch_y = int2str(y);
string str1 = "";
str1 = str1 + "0" + ch_x + "0" + ch_y;
// double k = (double)y / (double)x;
// y = kx + b; y2 = (y2 - y1) / (x2 - x1) * x2 + b
// double b = (x2 - x1) * y2 - (y2 - y1) * x2;
// double b = y2 - k * x2;
int b1 = x2 * y2 - x1 * y2 - y2 * x2 + y1 * x2;
int b2 = x2 - x1;
int g2 = __gcd(b1, b2);
b1 /= g2;
b2 /= g2;
string ch_b1 = int2str(b1);
string ch_b2 = int2str(b2);
string str2 = "";
str2 = str2 + "0" + ch_b1 + "0" + ch_b2;
PSS node;
node.first = str1;
node.second = str2;
se.insert(node);
}
}
}
}
printf("%d\\n", se.size() + m + 1 + n + 1);
return 0;
}
集合放结构体
#include <cstdio>
#include <iostream>
#include <set>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <unordered_set>
using namespace std;
int n, m;
const int N = 1e4 + 5;
struct Node {
int k1, k2;
int b1, b2;
Node() {}
Node(int k1, int k2, int b1, int b2) : k1(k1), k2(k2), b1(b1), b2(b2) {}
// 记得要写重载小于
bool operator<(const Node &p) const {
if (k1 == p.k1) {
if (k2 == p.k2) {
if (b1 == p.b1) {
return b2 < p.b2;
}
return b1 < p.b1;
}
return k2 < p.k2;
}
return k1 < p.k1;
}
bool operator==(const Node &p) const {
return k1 == p.k1 && k2 == p.k2 && b1 == p.b1 && b2 == p.b2;
}
};
// 集合放进4个变量的结构体
set<Node> se;
int main() {
scanf("%d%d", &n, &m);
for (int x1 = 0; x1 <= n; ++x1) {
for (int y1 = 0; y1 <= m; ++y1) {
for (int x2 = 0; x2 <= n; ++x2) {
for (int y2 = 0; y2 <= m; ++y2) {
if (x1 == x2) {
continue;
}
if (y1 == y2) {
continue;
}
int k1 = y2 - y1;
int k2 = x2 - x1;
int g1 = __gcd(k1, k2);
k1 /= g1;
k2 /= g1;
int b1 = x2 * y2 - x1 * y2 - y2 * x2 + y1 * x2;
int b2 = x2 - x1;
int g2 = __gcd(b1, b2);
b1 /= g2;
b2 /= g2;
se.insert({k1, k2, b1, b2});
}
}
}
}
printf("%d\\n", se.size() + m + 1 + n + 1);
return 0;
}
浮点数相等
#include <cstdio>
#include <iostream>
#include <set>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <cmath>
using namespace std;
int n, m;
const double EPS = 1e-8;
struct Node {
double k;
double b;
Node () {}
Node (double k, double b) : k(k), b(b) {}
bool operator < (const Node &n) const {
if (fabs(n.k - k) < EPS) { // 排序
return n.b > EPS + b;
}
return n.k - k > EPS;
}
bool operator == (const Node &n) const { // 浮点数相等
return fabs(n.k - k ) < EPS && fabs(n.b - b) < EPS;
}
};
set<Node> se;
int main() {
scanf("%d%d", &n, &m);
for (int x1 = 0; x1 <= n; ++x1) {
for (int y1 = 0; y1 <= m; ++y1) {
for (int x2 = 0; x2 <= n; ++x2) {
for (int y2 = 0; y2 <= m; ++y2) {
if (x1 == x2) {
continue;
}
if (y1 == y2) {
continue;
}
double k = (double)(y2 - y1) / (double)(x2 - x1);
double b = y2 - k * x2;
se.insert({k, b});
}
}
}
}
printf("%d\\n", se.size() + m + 1 + n + 1); // 40257
return 0;
}
一般式直线
struct Node {
int A, B, C;
// 记得要写重载小于
bool operator<(const Node &p) const {
if (A == p.A) {
if (B == p.B) {
return C < p.C;
}
return B < p.B;
}
return A < p.A;
}
bool operator==(const Node &p) const {
return A == p.A && B == p.B && C == p.C;
}
};
set<Node> se;
/*
y - y1 = (y2 - y1) / (x2 - x1) * (x - x1)
(x2 - x1)(y - y1) = (y2 - y1)(x - x1)
(x2 - x1) * y - y1(x2 -x1) = (y2 - y1)x - x1(y2 - y1)
(y2 - y1)x + (x1 - x2)y + y1(x2 - x1) - x1(y2 - y1) = 0
Ax + By + C = 0
*/
int n, m;
int main() {
scanf("%d%d", &n, &m);
for (int x1 = 0; x1 <= n; ++x1) {
for (int y1 = 0; y1 <= m; ++y1) {
for (int x2 = 0; x2 <= n; ++x2) {
for (int y2 = 0; y2 <= m; ++y2) {
if (x1 == x2) {
continue;
}
if (y1 == y2) {
continue;
}
以上是关于2021年B组第1场真题的主要内容,如果未能解决你的问题,请参考以下文章