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

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

时间:2024-05-17 22:42:50浏览次数:23  
标签:return temp int 题解 蓝桥 ++ vec 填空 operatorname

试题 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/cq-irritater/p/18198821/solution-luogu-p8741

相关文章

  • P8679 [蓝桥杯 2019 省 B] 填空问题 题解
    题目传送门试题A:组队【解析】本题是一道经典的DFS搜索题,每次对各号位的选手进行DFS,找到各号位上有成绩的选手时再进行进一步搜索即可。【程序】#include<bits/stdc++.h>usingnamespacestd;intteam[20][6];intmax_sum;boolvis[20];voiddfs(intu,intsu......
  • P9517 drink 题解
    题目传送门这道题考场上用的查找做的。先用一个结构体分别表示firstlast,然后进行查找即可,两个for循环分别计算出first和last,最后计算它们的差值。(注意,计算差值时要加1)然后你就会发现一个问题:只有\(90\)分。所以我们来思考一下哪里出现了问题。你会发现:如果全都是......
  • Codeforces 959B Mahmoud and Ehab and the message 题解
    题目简述小A想要给他的朋友小B发送了一条有$m$个单词的消息。他们的语言由编号从$a_1$到$a_n$的$n$个单词组成。一些单词具有相同的意思,因此存在$k$个单词组,其中每个组中的所有单词具有相同的意思。小A知道第$i$个单词可以以成本$m_i$发送。对于他的每个消息......
  • Codeforces 1113B Sasha and Magnetic Machines 题解
    题目简述有一个长度为$n$的正整数序列。你可以对这个数列进行最多$1$次的如下操作:选择两个数$i$和$j$,其中$1\leqi,j\leqn$并且$i\neqj$,并选择一个可以整除$a_i$的正整数$x$,然后将$a_i$变为$\frac{a_i}{x}$,将$a_j$变为$a_j\cdotx$。问你操作后,该序......
  • Codeforces 1037C Equalize 题解
    题目描述给定两个长度为$n$的$01$序列$a,b$。每次可以执行如下操作:在$a$中选择一个位置$p$,将$a_p$变为$1-a_p$,代价是$1$。在$a$中选择两个位置$p,q$,将$a_p$和$a_q$互换,代价是$\lvertq-p\rvert$。问最少需要多少代价才能将$a$变成$b$。题目分析......
  • CF1884D Counting Rhyme 题解
    题目链接:CF或者洛谷给个莫反题解,讲讲常规套路题目要求满足没有\(a_k\mida_i与a_k\mida_j\)的\((i,j)\)的对数,显然即不存在\(a_k\mid\gcd(a_i,a_j)\)。稍微拓展下,如果不存在整除多个数,那么显然不整除它们的\(\gcd\)即可,因为它们的公因数即为满足的最大数,如果为......
  • ArchLinux/Manjaro升级到6.9内核后的问题解决
    1.KDEWallet系统配置---个性化---账户详细信息---kde钱包1.需要启用kde钱包子系统,否则无法正常使用记录的账号密码信息2.右下角,调用钱包管理器,修改密码,设置为空密码至此,开机需要输密码连接kdewallet的应用不需要输入即可密码连接2.更新archcn-keyring报GPG错误解决:sudopa......
  • P10466的题解
    (一)出门左转P3369。只需要同时记录原本属于哪一位即可。这里给出Splay做法。(二)AC代码。建议自己打一遍巩固印象。虽然我是直接拉过来的。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;inlineintread(){intx=0,f=1;charc=getchar();wh......
  • Ollama的常见问题解答(FAQ)
     1如何更新Ollama? 在macOS和Windows上,Ollama会自动检查更新。只需点击任务栏或菜单栏图标,然后选择“重启以更新”来应用新版本。 在Linux上,需要重新运行安装脚本来升级。 2如何查看日志? 查阅特定的故障排查文档来了解如何查看和使用日志。 3我的GPU是否兼容Ollama? ......
  • 题解:CF1954F Unique Strings
    link计数类*3100首次独立过纪念版题解。首先我们考虑一个去重的问题。貌似针对循环同构去重的问题,只能从循环节上入手。那么我们考虑设\(dp(d)\)为最小循环节长度恰好为\(d\)不同方案数个数,则答案为:\[\sum_{d=1}^ndp(d)=\sum_{d|n}\frac{dp(d)}{d}\]这似乎是一条可行......