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

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

时间:2024-04-14 12:00:12浏览次数:33  
标签: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/18133952/solution-p8741

相关文章

  • [题解]P3413 萌数
    P3413萌数先打出暴搜代码,参数有\(pos,limit,hui\),其中bool类型的\(hui\)表示到当前是否有回文。暴搜代码中加入了一个剪枝:if(!limit&&hui)returnpow10[pos];,这个!limit很重要,我就是因为这个没加,暴搜代码都调了半天。然后就是if(pos==0)returnhui;。我们还需要记录下填过的......
  • [题解]CF55D Beautiful Numbers
    CF55DBeautifulNumbers打出暴搜后有些茫然,不知道该怎么优化才好,看了题解才豁然开朗。简单说下暴搜的思路:参数有\(pos,limit,lcm,num\)。其中\(lcm\)表示到\(pos+1\)位,所有非\(0\)位的\(lcm\)是多少;\(num\)表示填到\(pos+1\)位的整个数是多少。然后在\(pos=0\)时判断\(lcm\)是......
  • [题解]CF1073E Zegment Sum
    CF1073ESegmentSum这道数位dp与其他不同的是,这个求的是满足要求的数的和,这种题型的题我们还没有做过。以前虽然做过一些求和或者求积的题,但都是求每个满足条件的数的数位和、二进制1的个数等等的和。而这道题是对\([L,R]\)中满足条件的数直接求和,这意味着基本不会有两个状态得......
  • [NOIP2018] 旅行 题解
    明显要以\(1\)为起点。原图是树这种情况下,走路不能回头,只能用\(dfs\)的思路走。当然肯定每次都走较小的那棵子树,\(vector\)存图后排序即可达到这种效果。时间复杂度\(O(n\logm)\)。原图是基环树明显可以分别考虑将所有边断掉后的情况,取字典序最小的。时间复杂度\(O(......
  • CF382B Number Busters 题解
    总共就两种情况。当\(b\geqx\)时,\(b\)要减\(x\),\(c\)要减去一。当\(b\ltx\)时,\(a\)和\(c\)都要减一,\(b=w-x\)。如果\(c>a\),退出循环。每一次循环判断\(b\)跟\(x\)的关系,然后秒数加一。代码:#include<bits/stdc++.h>usingnamespacestd;inta,b,c,w,x;in......
  • CF455C Civilization 题解
    思路求树的直径,并存在一个数组里。用并查集来动态合并加维护区域信息(包括同一颗树里的有着相同祖先的点的合并,不同树之间的合并)。假设\(length\)数组:对于每棵树的根节点\(x\),\(length_{x}=\)该树的直径长度接下来对于每个询问(如果给出的两点在同一颗树内则忽略),利用并查......
  • [题解]SP10606 Balanced Numbers
    SP10606BalancedNumbers关于优化方式的说明详见数位dp例题及详解-下。SPOJ注册不上所以暂时无法提交w,但是3份代码与正解对拍没有问题。使用\(vis[0\sim9]\)表示\(0\sim9\)的访问情况,\(sta[0\sim9]\)表示\(0\sim9\)填写个数的奇偶性(奇数为\(1\),偶数为\(0\))。暴搜先打出来,......
  • 第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组题解
    试题A:握手问题本题总分:\(5\)分思路:组合计数,用为\(50\)个人握手的总方案数\(C^{2}_{50}\),减去七个人彼此没有握手握手的方案数\(C^{2}_{7}\)即为答案。A:握手问题#include<bits/stdc++.h>#defineintlonglong#definedblongdouble#defineall(f)f.begin()......
  • CF1923B Monsters Attack! 题解
    题目简述数轴上有$n$个怪兽。最初第$i$个怪兽在$x_i$位置上,且血量为$a_i$。你在位置$0$上。在每秒钟会发生:你给任意怪兽发射总共$k$颗子弹,受到攻击的怪兽血量减一。血量小于等于$0$的怪兽死亡。没有死亡的怪兽向你移动一个单位。当一个怪兽来到你的位置,你就输......
  • CF1165E Two Arrays and Sum of Functions 题解
    题目简述已知两个长度均为$n$的数组$a$和$b$。给定一个函数:$f(l,r)=\sum\limits_{l\lei\ler}a_i\cdotb_i$。你的任务是对数组$b$中的元素以任意的顺序重新排序,使$\sum\limits_{1\lel\ler\len}f(l,r)$的值最小。题目分析我们首先进行化简,发现题......