1.前言
离第十五届蓝桥杯的正式开始时间已经所剩无几了,从现在要马上开始刷真题咯~,给大家分享去年的前俩道真题。
2.俩则题目
1.日期统计
题目描述
这边直接截图过来了哈哈哈,清晰度应该还可以。
题目解析
先上题解
#include <iostream>
#include <algorithm>
#include <cmath>
//这些头文件我写习惯了hhh
using namespace std;
const int numbers[100] = {5, 6, 8, 6, 9, 1, 6, 1, 2, 4, 9, 1, 9, 8, 2, 3, 6, 4, 7, 7, 5, 9, 5, 0, 3, 8, 7, 5, 8, 1, 5,
8, 6, 1, 8, 3, 0, 3, 7, 9, 2, 7, 0, 5, 8, 8, 5, 7, 0, 9, 9, 1, 9, 4, 4, 6, 8, 6, 3, 3, 8, 5,
1, 6, 3, 4, 6, 7, 0, 7, 8, 2, 7, 6, 8, 9, 5, 6, 5, 6, 1, 4, 0, 1, 0, 0, 9, 4, 8, 0, 9, 1, 2,
8, 5, 0, 2, 5, 3, 3};//储存子序列
const int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};//注意数组是从0开始编号的,所以说第一个位置设置为0
int main(){
int ans =0;
for(int i=1;i<=12;i++){
for(int j=1;j<=days[i];j++){
string str ="2023";//该函数用于将数字转化成字符类型
if(i<10){
str +="0";
}
str +=to_string(i);
if(j<10){
str +="0";
}
str +=to_string(j);
int k=0;
for(int l=0;k<8&&l<100;l++){
if(numbers[l]==str[k]-'0')k++;
}//逐一判断该日期是否符合条件
if(k>=8){
ans++;
}
}
}
printf("%d",ans);//最后打印
return 0;
}
这道题的思路就是非常野蛮的逐个枚举再逐个判断是否符合条件。这个题目也有许多小细节,例如创建月份数组时,由于数组本身标记是从0开始,所以数组的第一位就设置为0。其次再介绍一下to_string函数,该函数是用于将数字转换成字符类型,具体使用看代码。最后的最后,再介绍一个易错点----单引号和使用的使用区别:前者里面放置单个字符,后者里面是放置字符串,本人在敲代码时居然被这个卡了好久。
2.01串的熵
题目描述
剪切粘贴题目qwq
题目解析
这道题目就是先上一个新定义,让你做一会阅读理解,只要理解题目含义,接下来就是代码实现的问题了
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int total=23333333;
const double H=11625907.5798;
int main(){
for(int i=0;i<total/2;i++){
double ans=0;
ans-=1.0*i*i/total*log2(1.0*i/total);
ans-=1.0*(total-i)*(total-i)/total*log2(1.0*(total-i)/total);
if(abs(ans-H)<0.0001){
printf("%d",i);
return 0;
}
}
return 0;
}
思路也是暴力枚举(鼠鼠我啊只会这种无脑的思路啊~~~),按照题目公式代入,直到枚举到正解即可,时间上居然能过,也算是给我留一条小命。
另外,if里面的判断条件小于0.0001的原因是题目中所牵扯到的小数都是四位小数,所以这样判断。ans等式中乘以1.0的原因是是将代数式在计算过程当中提前转化为小数,这样就进行的是小数运算而不是整数运算。
3.小结
今天题目分享就到这咯,我自己也会继续加油嘞,大家也要加油学喔~希望能对大家有所帮助。