首页 > 其他分享 >P8741 [蓝桥杯 2021 省 B] 填空问题 题解

P8741 [蓝桥杯 2021 省 B] 填空问题 题解

时间:2023-10-15 10:33:49浏览次数:48  
标签:return temp int 题解 蓝桥 ++ vec 填空 operatorname

P8741 [蓝桥杯 2021 省 B] 填空问题 题解

题目传送门

欢迎大家指出错误并联系这个蒟蒻

更新日志

  • 2023-05-09 23:19 文章完成
  • 2023-05-09 23:20 通过审核
  • 2023-06-20 21:03 优化了文章代码格式

试题 A :空间

【解析】
本题考察计算机存储的基础知识,只要掌握空间存储的换算方法,就能够算出答案。
【程序】

#include <bits/stdc++.h>

using namespace std;

int main() {
    printf("%d\n", 256 * 8 / 32 * 1024 * 1024);
    return 0;
}

【答案】
67108864

试题 B :卡片

【解析】
这道题应该先定义一个长度为 \(10\) 的数组,用来存放数字 \(0 \sim 9\) 的卡片数,下标则代表数字,元素代表卡片已经使用的张数,初始值为 \(0\) ,每种卡片如果使用超过 \(2021\) 张,则输出结果。
程序从 \(1\) 开始递增遍历,当遍历到某个数时,将拼成该数所需的所有卡片类型数增加,随后判断数组中每种卡片是否被用完,如果用完则退出循环。
【程序】

#include <bits/stdc++.h>

using namespace std;

int a[10];

int main() {
    for (int s = 1;; s++) {
        int temp = s;
        while (temp) {
            a[temp % 10]++;
            temp /= 10;
        }
        for (int i = 1; i < 10; i++) {
            if (a[i] > 2021) {
                printf("%d\n", s - 1);
                // 减1是因为这一张无法凑出
                return 0;
            }
        }
    }
    return 0;
}

【答案】
3181

试题 C :直线

【解析】
本题很容易让人想到枚举和去重,本人代码就是用枚举和去重来实现的。
为了储存 \(3\) 个数,本人采取了 \(\operatorname{STL}\) 中 \(\operatorname{pair}\) 类来表示,为了去重,本人采取了 \(\operatorname{STL}\) 中的 \(\operatorname{set}\) 集合 (如果没学过,请自行查阅资料)
【程序】

#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> PII;
typedef pair<PII, int> PIII;

set<PIII> s;

vector<PII> vec;

int gcd(int a, int b) {
    if (b == 0) {
        return a;
    }
    return gcd(b, a % b);
}

int main() {
    for (int i = 0; i < 20; i++) {
        for (int j = 0; j < 21; j++) {
            vec.push_back({ i, j });
        }
    }
    for (int i = 0; i < vec.size(); i++) {
        for (int j = i + 1; j < vec.size(); j++) {
            int x1 = vec[i].first, y1 = vec[i].second;
            int x2 = vec[j].first, y2 = vec[j].second;
            int A = x2 - x1, B = y1 - y2, C = x1 * y2 - x2 * y1;
            int gcdd = gcd(gcd(A, B), C);
            s.insert({ { B / gcdd, A / gcdd }, C / gcdd });
        }
    }
    cout << s.size() << endl;
    return 0;
}

【答案】
40257

试题 D :货物摆放

【解析】
本题根据题意,要满足 \(\operatorname{n}=\operatorname{x}\times \operatorname{y}\times \operatorname{z}\) 的所有情况,首先想到枚举法,分为两步:
1、找出 \(n\) 的所有因子。
2、对所有因子进行暴力枚举。

【程序】

#include <bits/stdc++.h>

using namespace std;

long long a[100];
long long n = 2021041820210418;

int len;

int main() {
    for (long long i = 1; i * i <= n; i++) {
        if (n % i == 0)
        // i是约数
        {
            a[len++] = i;
            // 将约数放入数组
            if (n / i != i)
            // n/i也是约数
            {
                a[len++] = n / i;
            }
        }
    }
    int ans = 0;
    for (int i = 0; i < len; i++) {
        for (int j = 0; j < len; j++) {
            for (int k = 0; k < len; k++) {
                if (a[i] * a[j] * a[k] == n) {
                    ans++;
                }
            }
        }
    }
    printf("%d\n", ans);
    return 0;
}

【答案】
2430

试题 E :路径

【解析】
本题题意比较直接,通过题意就可以知道题目考查图的最短路径算法,本人则使用了 \(\operatorname{Dijkstra}\) 算法直接计算 (如果没学过,请自行查阅资料并学习)
【程序】

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 2022;

int edges[MAXN][MAXN];
int d[MAXN];

bool visited[MAXN];

int gcd(int u, int v) {
    int temp = u % v;
    while (temp > 0) {
        u = v;
        v = temp;
        temp = u % v;
    }
    return v;
}
int lcm(int u, int v) {
    return (u * v / gcd(u, v));
}

int main() {
    memset(edges, 0x3f3f3f, sizeof(edges));
    for (int i = 1; i <= 2021; i++) {
        edges[i][i] = 0;
        for (int j = i + 1; j <= 2021; j++) {
            if (j - i <= 21) {
                edges[i][j] = edges[j][i] = lcm(j, i);
            } else {
                break;
            }
        }
    }
    memset(d, 0x3f3f3f, sizeof(d));
    memset(visited, false, sizeof(visited));
    d[1] = 0;
    for (int i = 1; i < 2021; i++) {
        int x = 0;
        for (int j = 1; j < 2021; j++) {
            if (!visited[j] && d[j] < d[x]) {
                x = j;
            }
        }
        visited[x] = 1;
        for (int j = max(1, x - 21); j <= min(2021, x + 21); j++) {
            d[j] = min(d[j], d[x] + edges[x][j]);
        }
    }
    printf("%d\n", d[2021]);
    return 0;
}

【答案】
10266837

标签:return,temp,int,题解,蓝桥,++,vec,填空,operatorname
From: https://www.cnblogs.com/szyawa/p/solution-p8741.html

相关文章

  • P8679 [蓝桥杯 2019 省 B] 填空问题 题解
    P8679[蓝桥杯2019省B]填空问题题解题目传送门欢迎大家指出错误并联系这个蒟蒻更新日志2023-05-2521:02文章完成2023-05-2711:34文章通过审核2023-06-2021:03优化了文章代码格式试题A:组队【解析】本题是一道经典的DFS搜索题,每次对各号位的选手进行DFS,......
  • P8684 [蓝桥杯 2019 省 B] 灵能传输 题解
    P8684[蓝桥杯2019省B]灵能传输题解Part1提示题目传送门欢迎大家指出错误并私信这个蒟蒻欢迎大家在下方评论区写出自己的疑问(记得@这个蒟蒻)Part2更新日志2023-06-2021:46文章完成2023-07-0308:57文章通过审核2023-08-2118:14更改了文章格式,使文章看起......
  • 算法题解——买卖股票的最佳时机
    解题思路先考虑最简单的「暴力遍历」,即枚举出所有情况,并从中选择最大利润。设数组prices的长度为n,由于只能先买入后卖出,因此第1天买可在未来n−1天卖出,第2天买可在未来n-2天卖出……以此类推,共有\[(n-1)+(n-2)+\cdots+0=\frac{n(n-1)}{2}\]种情况,时间复......
  • Atcoder Beginner Contest 324 F Beautiful Path 题解-分数规划
    为了更好的阅读体验,请点击这里分数规划小技巧:尽可能将式子写成存在某种取值,使得不等式成立的形式。不然可能需要绕几个弯才能想出来。题目链接题目大意:给出一个DAG,每条边有一个\(b_i,c_i\),保证从编号小的边向编号大的边连边,且\(1\)到\(n\)必有路径,求\(1\)到\(n\)......
  • CF1204D2 Kirk and a Binary String (hard version) 题解
    CF1204D2KirkandaBinaryString(hardversion)题解分析先来分析\(01\)串的最长不下降子序列。全是\(0\)显然是不下降的,如果中间出现一个\(1\),为了维护不下降的性质,后面就只能全是\(1\)。一句话概括一下,\(0\)后面能跟\(0,1\),\(1\)后面只能跟\(1\)。现在来分析这......
  • 题解 [ABC258G] Triangle
    题目链接\(\rmO(n^3)\)枚举\(i,j,k\)的算法是显然的。考虑优化掉一个\(n\),如果枚举\(i,j\),那么显然需要找出有多少个\(k\)同时满足\(a_{i,k}=a_{j,k}=1\),我们可以将\(a_i\)和\(a_j\)看作两个二进制数,那么同时等于\(1\)的位置就是并起来等于\(1\)的位置,\(bitset......
  • 观光奶牛 详细题解
    #T3#SPFA判断正/负环#二分查找为啥现在突然发出来:翻自个笔记发现这篇写的挺好hhh361.观光奶牛-AcWing题库给定一张\(L\)个点、\(P\)条边的有向图,每个点都有一个权值\(f[i]\),每条边都有一个权值\(t[i]\)。求图中的一个环,使“环上各点的权值之和”除以“环上各边的......
  • [题解]AT_abc153_f [ABC153F] Silver Fox vs Monster
    模拟赛最后\(15\)分钟想到的做法。思路首先有一个显然的贪心策略:我们放炸弹的地方要尽可能的使这个炸弹能影响到更多的怪上。那么我们可以将对于一个怪\(i\)能够影响到它的区间表示出来\([\max(1,l_i-d),a_i+r]\)。然后将这些区间排个序,可以粗略画出这样的图:根据上......
  • P1084疫情控制 题解
    P1084疫情控制前言:这题思路不难,实现稍微有点难。总体来说,不算特别难的那种紫题,建议评蓝。题目描述给定一些点,用这些点来切断根节点到所有叶子节点的路径,可以移动这些点,不同的点可以同时移动,求时间最少。思考过程不同的点可以同时移动:看到这里,我们可以转化一下题目:给定......
  • [AGC033C] Removing Coins题解
    思路可以看出,每次对一个点\(u\)操作一次,就相当于删除以\(u\)为根的所有叶节点。当然我们还是没有什么思路,我们可以想简单一点:在一条链上的情况。如果\(u\)是链的端点:以\(u\)为根节点的叶节点只有一个,所以链的长度减一。如果\(u\)不是链的端点:以\(u\)为根节点......