【蓝桥杯】每日四道填空题(两道真题+两道模拟题|第二天

专栏: 蓝桥杯——每日四道填空题(两道真题+两道模拟题)
&离蓝桥杯已经不到一个月时间了,赶快刷起来吧,填空题一定别丢分!!
꒰•̀ᴗ•́꒱
另一个专栏是: 蓝桥杯——编程题刷题营(每日四题,两道模拟,两道真题)

第一道真题(2021 省赛B组):答案:67108864

这题考点是对于计算机基础的理解,所以基础!!!很重要

分析:256MB = 256 * 1024 KB = 256 * 1024 * 1024 B(字节)

因为题目中说了数组的每一个元素是32位的二进制整数,所以占32 / 8 = 4(字节)。

所以个数:( 256 * 1024 * 1024 ) / 4 , 还是交给计算机算吧,等下算错就不好了,hh~

#include <iostream>
using namespace std;
int main()
{
    printf("%d", (256 * 1024 * 1024) / 4) ;
    return 0;
}

第二道真题(2021省赛B组):答案:2430

这道题你如果一开始就三个循环暴力枚举的话,你可能一天都跑不完程序,这里其实你可以先把它的因子全部找出来,然后再对其因子进行三个循环枚举就节省很多时间了。

#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
ll n = 2021041820210418 , counts ;
vector <ll> factor ; //存因数
int main()
{
  for (ll i = 1 ; i * i <= n ; ++i)
  {
    if (n % i == 0){
      factor.push_back(i);
      if (n / i != i){  //将相同因子排除
        factor.push_back(n / i);
      }
    }
  }
  //将所有因子分别枚举,看是否满足条件
  for (auto a : factor)
  {
    for (auto b : factor)
    {
      for (auto c : factor)
      {
        if (a * b * c == n ){
           counts++;
        }
      }
    }
  }
  printf("%lld", counts);
  return 0;
}

第三道模拟题(2022第四次模拟):答案:564

这题考察我们对于一个数的每一位的分解。

#include <iostream>
using namespace std;
int main()
{
    int cnt = 0, g , s , b , q;
    for (int i = 1 ; i <= 2021 ; ++i){
        g = i % 10;
        s = (i / 10) % 10;
        b = (i / 100) % 10;
        q = (i / 1000) % 10;
        if (g == 2 || s == 2 || b == 2 || q == 2){
            cnt++;
        }        
    }
    cout<<cnt;
    return 0;
}

第四道模拟题(2022第三次模拟):答案:148

题目:最大连通块

110010000011111110101001001001101010111011011011101001111110
010000000001010001101100000010010110001111100010101100011110
001011101000100011111111111010000010010101010111001000010100
101100001101011101101011011001000110111111010000000110110000
010101100100010000111000100111100110001110111101010011001011
010011011010011110111101111001001001010111110001101000100011
101001011000110100001101011000000110110110100100110111101011
101111000000101000111001100010110000100110001001000101011001
001110111010001011110000001111100001010101001110011010101110
001010101000110001011111001010111111100110000011011111101010
011111100011001110100101001011110011000101011000100111001011
011010001101011110011011111010111110010100101000110111010110
001110000111100100101110001011101010001100010111110111011011
111100001000001100010110101100111001001111100100110000001101
001110010000000111011110000011000010101000111000000110101101
100100011101011111001101001010011111110010111101000010000111
110010100110101100001101111101010011000110101100000110001010
110101101100001110000100010001001010100010110100100001000011
100100000100001101010101001101000101101000000101111110001010
101101011010101000111110110000110100000010011111111100110010
101111000100000100011000010001011111001010010001010110001010
001010001110101010000100010011101001010101101101010111100101
001111110000101100010111111100000100101010000001011101100001
101011110010000010010110000100001010011111100011011000110010
011110010100011101100101111101000001011100001011010001110011
000101000101000010010010110111000010101111001101100110011100
100011100110011111000110011001111100001110110111001001000111
111011000110001000110111011001011110010010010110101000011111
011110011110110110011011001011010000100100101010110000010011
010011110011100101010101111010001001001111101111101110011101

小蓝有一个 30 行 60 列的数字矩阵,矩阵中的每个数都是 0 或 1 。如果从一个标为 1 的位置可以通过上下左右走到另一个标为 1 的位置,则称两个位置连通。与某一个标为 1 的位置连通的所有位置(包括自己)组成一个连通分块。请问矩阵中最大的连通分块有多大?


这题我认为dfs这方面的题应该很常见,要找这种最佳路径(这里是最大连通块),如果时间允许的话,枚举+递归的方法,既简单又实用。

注意:最大连通块就是比较不同连通块中最多的那个,所有下面代码,每次查找过的点需要赋值成零,且不需要再恢复现场了。

#include <iostream>
#include <algorithm> 
using namespace std;
string str[31];
int dfs(int x , int y)
{
    int cnt = 1;//每次满足递归连通块+1; 
    str[x][y] = '0';//用过的点,排除点 
    int hx[4] = {-1,1,0,0} , ly[4] = {0,0,-1,1};
    for (int k = 0 ; k < 4 ; ++k)
    {
        int c = x + hx[k] , b = y + ly[k];
        if(c >= 0 && c < 30 && b >= 0 && b < 60 && str[c][b] == '1' )
        {
            cnt += dfs(c , b); 
        }
    } 
    return cnt;
}
int main()
{
    for (int i = 0 ; i < 30 ; ++i ){
        cin>>str[i];
    }
    int res = 0;
    for (int i = 0 ; i < 30 ; ++i)
    {
        for (int j = 0 ; j < 60 ; ++j)
        {
            if(str[i][j] == '1'){
                 res = max(res , dfs(i , j));
            }
        }
    }
    cout<<res;
    return 0;
}

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吹往北方的风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值