前言
这些填空都是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 的数字字符串,有以下要求:
- 小蓝不喜欢数字0,所以数字字符串中不可以出现0 ;
- 小蓝喜欢数字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;
}