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场真题的主要内容,如果未能解决你的问题,请参考以下文章

2020年B组第二场真题

2020年B组第三场真题

2020年7月B组第一场真题

2020年第十一届蓝桥杯C/C++ B组第二场省赛真题

# 2020年第十一届蓝桥杯C/C++ B组第二场省赛真题

2020年第十一届蓝桥杯C/C++ B组第二场省赛真题