蓝桥杯专项练习--填空

前言

这些填空都是2024年蓝桥杯的填空。
握手问题在专栏里有,就不写了
大部分都是日期、模拟、找规律、简单数学
题目旁边的时题号

1.19696 拼正方形(简单数学)

【问题描述】

小蓝正在玩拼图游戏,他有7385137888721个2×2的方块和10470245个1×1的方块,他需要从中挑出一些来拼出一个正方形,比如用 3个2×2和4个1×1的方块可以拼出一个4×4的正方形,用9个2×2的方块可以拼出一个6×6的正方形,请问小蓝能拼成的最大的正方形的边长为多少。

思路:

由题目可知,这个正方体里面由2 * 2的方块拼成,外面由1 * 1的围起来
由2 * 2 可以围成最大的方块为5435122,但是1 * 1的方块并不能在外面再围一层,所以答案就是5435122

2.19697 劲舞团 (模拟)

【问题描述】

小蓝最近迷上了一款名为 “劲舞团” 的游戏,具体来说,只要按照游戏中给出的键位提示依次按出对应的键位,游戏人物便可以跟随节奏跳舞。对于连续的K次正确敲击,如果任意连续的两次敲击间间隔时间都小于等于1s,那么我们称这是一次K连击。现在给出一局小蓝的游戏记录文件,log.txt中记录了N条记录,每条记录有三个字段,依次为正确的敲击字符、小蓝打出的字符、打出字符的时间对应的毫秒时间戳。现在请你计算下最长的K连击是多少,你只需要输出K的值。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct s{
  char a; //正确的敲击字符
  char b; // 小蓝打出的字符
  ll be; //打出字符的时间对应的毫秒时间戳
};
int main()
{
  s r;
  ll after; //记录上一次打出字符的时间戳
  after=0;
  int maxx,sum;
  maxx=sum=0;//maxx记录最长的连击,sum记录连击
  while(cin >> r.a >> r.b >> r.be)
  {
    //判断字符是否一致
    if(r.a==r.b)
    {
      //一致,判断前后时间受否小于等于1s
      if(r.be-after<=1000)
      {
        sum++;
      }
      else 
      {
        sum=1;
      }
    }
    //不一致,重置为0
    else 
    {
      sum=0;
    }
    after=r.be;
    maxx=max(maxx,sum);
  }
  cout << maxx;
  return 0;
}

3. 19700 召唤数学精灵(简单数学)

【问题描述】

数学家们发现了两种用于召唤强大的数学精灵的仪式,这两种仪式分别被称为累加法仪式A(n)和累乘法仪式B(n)。累加法仪式A(n)是将从1到n的所有数字进行累加求和,即:A(n)=1+2+· · ·+n 。累乘法仪式 B(n)则是将从1到n的所有数字进行累乘求积,即:B(n)=1×2×· · ·×n 。据说,当某个数字i满足A(i)−B(i)能被100整除时,数学精灵就会被召唤出来。现在,请你寻找在1到2024041331404202之间有多少个数字i,能够成功召唤出强大的数学精灵。

思路:

由题意得:当n>=10时,B(n)都能被100整除,所以看A(n)能有多少个数字累加能被100整除,通过计算在10到200内有4个数字可以被100整除,所以每200就有4个数字A(i)−B(i)能被100整除,最后还有1到10,发现3和1也可以被100整除。

代码

#include <bits/stdc++.h>
using namespace std;
using ll =long long;
int main()
{
  ll ans,sum;
  ans=2024041331404202;
  sum=ans/200;
  cout << sum*4+2;
}

4.19701 穿越时空之门 (进制转换)

【问题描述】

随着2024年的钟声回荡,传说中的时空之门再次敞开。这扇门是一条神秘的通道,它连接着二进制和四进制两个不同的数码领域,等待着勇者们的探索。在二进制的领域里,勇者的力量被转换成了力量数值的二进制表示中各数位之和。在四进制的领域里,力量的转换规则相似,变成了力量数值的四进制表示中各数位之和。穿越这扇时空之门的条件是严苛的:当且仅当勇者在二进制领域的力量等同于四进制领域的力量时,他才能够成功地穿越。国王选定了小蓝作为领路人,带领着力量值从1到2024的勇者们踏上了这段探索未知的旅程。作为小蓝的助手,你的任务是帮助小蓝计算出,在这2024位勇者中,有多少人符合穿越时空之门的条件。

思路:

找出1~2024中的数,它的二进制的各数位之和,等于它的四进制的数位之和

代码

#include <bits/stdc++.h>
using namespace std;
const int N=1050;
int a[N],b[N];
int cnt=0; 
char ch[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
int main()
{
  int n,m;
  n=2,m=4;
  for(int j=1;j<=2024;j++)
  {

    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    int sum,sum1;
    sum=sum1=0;
    string ans;
    int i=j;
    //二进制转换
    while(i)
    {
      ans+=ch[i%n];
      i/=n;
    }
    int len=ans.size();
    ans="#"+ans;
    for(int k=1;k<=len;k++)
    {
      if(ans[k]>='0'&&ans[k]<='9') a[k]=ans[k]-'0';
      else a[k]=ans[k]-'A'+10;
      sum+=a[k]; 
    }
    
	//四进制转换
	  int o=j;
    string ans1;
    while(o)
    {
      ans1+=ch[o%m];
      o/=m;
    }
    int len1=ans1.size();
    ans1="#"+ans1;
    for(int p=1;p<=len1;p++)
    {
      if(ans1[p]>='0'&&ans1[p]<='9') b[p]=ans1[p]-'0';
      else b[p]=ans1[p]-'A'+10;
      sum1+=b[p]; 
    }
    if(sum==sum1) cnt++;
  }
  cout << cnt;
  return 0;
}

19698 报数游戏(找规律)

【问题描述】

小蓝和朋友们在玩一个报数游戏。由于今年是2024年,他们决定要从小到大轮流报出是20或24倍数的正整数。前10个被报出的数是:20, 24, 40, 48, 60, 72, 80, 96, 100, 120。请问第202420242024个被报出的数是多少?

思路:

奇数上都是20的倍数,偶数上都是24的倍数,所以202420242024一定是24的倍数

代码

#include <iostream>
using namespace std;
int main()
{
  cout << 202420242024/2*24;
}

19699 类斐波那契循环数(模拟)

【问题描述】

在这里插入图片描述

思路:

由题意可以看出197是3位数,所以它的公式就是

f[i]=f[i-1]+f[i-2]+f[i-3]

所以10的7次方就是7个相加,题目是找到最大的,就从最后面开始找就行了

代码

#include <bits/stdc++.h>
using namespace std;
using ll =long long;
int s(int n)
{
  ll f[30];
  //因为有7位数,所以先把它们计算出来
  f[1]=n/1000000;
  f[2]=n/100000%10;
  f[3]=n/10000%10;
  f[4]=n/1000%10;
  f[5]=n/100%10;
  f[6]=n/10%10;
  f[7]=n%10;
  for(int i=8;i<30;i++)
  {
    //不断循环去找
    f[i]=f[i-1]+f[i-2]+f[i-3]+f[i-4]+f[i-5]+f[i-6]+f[i-7]; 
    //第一次,如果用这7个数能过找出来与传参过来的数相等,这个就是最大的
    if(f[i]==n) return 1;
    
  }
  return 0;
}
int main()
{

  //从最后面开始找
  for(ll i=9999999;i>=1000000;i--)
  {
    if(s(i)) 
    {
      cout << i ;
      break;
    }
  }
  return 0;
}

19937 艺术与篮球 (日期问题)

【问题描述】

题目太长,这里不贴出来了。概况地说,是把日期转成数字,然后计算。例如,在 2024 年 1 月 1 日这天,日期可表示为一个 8 位数字 20240101,其转换为汉字是“二零二四零一零一”。日期的总笔画数为 2 + 13 + 2 + 5 + 13 +1 + 13 + 1 = 50。

思路:

用map去存储它的笔画数

代码

#include <bits/stdc++.h>
using namespace std;
using ll=long long;
map<char,int>mp{
  {'0',13},{'1',1},{'2',2},{'3',3},{'4',5},{'5',4},{'6',4},{'7',2},{'8',2},{'9',2}
};
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool check(int y,int m,int d)
{
  if(m>12||m==0) return false;
  if(d==0) return false;
  if(m!=2)
  {
    if(d>days[m]) return false;
  }
  else 
  {
    int l=(y%400==0||y%100!=0&&y%4==0);
    if(d>28+l) return false;
  }
  return true;
}
int main()
{
  int ans=0;
  for(int i=20000101;i<=20240413;i++)
  {
      int sum=0;
      int year=i/10000,month=i%10000/100,day=i%100;
      //判断是否符合日期的格式
      if(check(year,month,day))
      {
          string s=to_string(i);
          int len=s.size();
          for(int i=0;i<len;i++)
          {
            sum+=mp[s[i]];
          }
      }
       if(sum>50) ans++;
  }
  cout << ans;
  return 0;
}

19732 小球反弹(模拟)

【问题描述】

在这里插入图片描述

思路:

本来是在这个长方体内不断循环,把它变成不断的去延申这个长方体,直到走到某个长方体的左上角,说明走完了

代码

#include <bits/stdc++.h>
using namespace std;
using ll =long long;
int main()
{
  ll x=343720,y=233333,t=1;
  while(1)
  {
    if((15*t)%x==0 && (17*t)%y==0) break;
    t++;
  }
  //要返回原来的路
  cout << fixed << setprecision(2) << (2*sqrt(15*15*t*t+17*17*t*t));
  return 0;
}

19702 数字串个数 (枚举)

【问题描述】

小蓝想要构造出一个长度为10000 的数字字符串,有以下要求:

  1. 小蓝不喜欢数字0,所以数字字符串中不可以出现0 ;
  2. 小蓝喜欢数字3和7 ,所以数字字符串中必须要有3和7这两个数字。
    请问满足题意的数字字符串有多少个?这个数字会很大,你只需要输出其对10的9次方+7 取余后的结果。

思路:

一共有9的10000次方个数,不包含3的有8的10000次方个,不包含7的也有8的10000次方个,
不包含3也不包含7的有7的10000次方个

代码

#include <bits/stdc++.h>
using namespace std;
using ll =long long;
int main()
{
  ll mod=1e9+7,n=10000,p9=1,p8=1,p7=1;
  //没有0的基础上
  for(int i=0;i<n;i++) p9=p9*9%mod;
  //没有0的基础上。没有3或者没有7
  for(int i=0;i<n;i++) p8=p8*8%mod;
  //没有0的基础上,没有3和没有7
  for(int i=0;i<n;i++) p7=p7*7%mod;

  //容斥原理:一共有9的10000次方个数,
  //不包含3的有8的10000次方个,
  //不包含7的也有8的10000次方个,
  //不包含3也不包含7的有7的10000次方个
  cout << (p9-2*p8+p7)%mod;
  return 0;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值