蓝桥杯第4期 1-4

1

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小蓝要为一条街的住户制作门牌号。

这条街一共有 20202020 位住户,门牌号从 11 到 20202020 编号。

小蓝制作门牌的方法是先制作 00 到 99 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、71、0、1、7,即需要 11 个字符 00,22 个字符 11,11 个字符 77。

请问要制作所有的 11 到 20202020 号门牌,总共需要多少个字符 22?

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M
#include<iostream>
using namespace std;
int main()
{
    long long ans=0,x;
    for(long long i=1;;i++){
        x=i;
        while(x){ if(x%10==1){ ans++; }
        
        x=x/10;
        
            }
    if(ans==2021){ cout<<i;break;    }
    
    
    }
    return 0;
    
    
    
}

2

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 小蓝发现,他将 11 至 10000000071000000007 之间的不同的数与 20212021 相乘后再求除以 10000000071000000007 的余数,会得到不同的数。 小蓝想知道,能不能在 11 至 10000000071000000007 之间找到一个数,与 20212021 相乘后 再除以 10000000071000000007 后的余数为 999999999999999999。如果存在,请在答案中提交这个数; 如果不存在,请在答案中提交 00。

#include<bits/stdc++.h>
using namespace std;

int main()
{
    long long tag = 999999999;
    long long mod = 1000000007;
    long long index = 2021;
    long long ans = 0;
    for(long long x = 1;x<=mod;x++)
    {
        if(((x*index)%mod)==tag)
        {
            ans = x;
            break;
        }
    }

    cout<<ans<<endl;
    return 0;
}

3

小蓝有一个超大的仓库,可以摆放很多货物。

现在,小蓝有 nn 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。

小蓝希望所有的货物最终摆成一个大的长方体。即在长、宽、高的方向上分别堆 LL、WW、HH 的货物,满足 n = L \times W \times Hn=L×W×H。

给定 nn,请问有多少种堆放货物的方案满足要求。

例如,当 n = 4n=4 时,有以下 66 种方案:1×1×4、1×2×2、1×4×1、2×1×2、2 × 2 × 1、4 × 1 × 11×1×4、1×2×2、1×4×1、2×1×2、2×2×1、4×1×1。

请问,当 n = 2021041820210418n=2021041820210418 (注意有 1616 位数字)时,总共有多少种方案?

提示:建议使用计算机编程解决问题。

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M
#include <iostream>
#include <vector>
using namespace std;
int main()
{
  long long int n = 2021041820210418, i, j, k;
  int cnt = 0;
  vector<long long int> a;
  for (i = 1; i * i <= n; ++i){
    if(n % i == 0){
      a.push_back(i);
      a.push_back(n / i);
    }
  } 
  for (i = 0; i < a.size(); ++i){
    for (j = 0; j < a.size(); ++j){
      for (k = 0; k < a.size(); ++k){
        if (a[i] * a[j] * a[k] == n){
          ++cnt;
        }
      }
    }
  }
  cout << cnt;
  return 0;
}

4

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图 中的最短路径。

小蓝的图由 2021 个结点组成,依次编号 1 至 2021。

对于两个不同的结点 a, b,如果 a 和 b 的差的绝对值大于 21,则两个结点 之间没有边相连;如果 a 和 b 的差的绝对值小于等于 21,则两个点之间有一条 长度为 a 和 b 的最小公倍数的无向边相连。

例如:结点 1 和结点 23 之间没有边相连;结点 3 和结点 24 之间有一条无 向边,长度为 24;结点 15 和结点 25 之间有一条无向边,长度为 75。

请计算,结点 1 和结点 2021 之间的最短路径长度是多少。

提示:建议使用计算机编程解决问题。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M
#include <bits/stdc++.h>
using namespace std;
///本题的关键是求取最小公倍数
///采用辗转相除法求最大公因数,然后相乘除以最大公因数,就得到最小公倍数
///然后采用迪杰特斯拉算法
int mp[2025][2025];
int dis[2025];    ///计算1号节点到其他节点的距离
int max_same(int a,int b){
    int x=max(a,b),y=min(a,b),temp;
    while(x%y){
        temp=y;
        y=x%y;
        x=temp;
    }
    return y;
}
struct Node{
    int to,w;
    bool operator <(const Node& a)const{
        return a.w<w;
    }
};
priority_queue<Node> qu;
void dijkstra(int a,int b){
    ///初始化距离数组
    for(int i=0;i<2025;i++)if(mp[a][i]!=0)qu.push({i,mp[a][i]}),dis[i]=mp[a][i];
    while(qu.size()){
        Node now=qu.top();qu.pop();
        ///更新距离数组
        for(int i=0;i<2025;i++)if(mp[now.to][i]&&dis[i]>dis[now.to]+mp[now.to][i])dis[i]=dis[now.to]+mp[now.to][i],qu.push({i,dis[i]});
    }
}
int main(){
    ///建图
    for(int i=1;i<=2021;i++)for(int j=1;j<=21;j++)mp[i][i+j]=i*(i+j)/max_same(i,i+j);
    ///初始化,将距离数组初始化至无穷大
    for(int i=1;i<=2021;i++)dis[i]=1e9;
    dijkstra(1,2021);
    printf("%d\n",dis[2021]);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值