C++蓝桥杯真题分享(1):日期统计与01的熵

 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.小结

今天题目分享就到这咯,我自己也会继续加油嘞,大家也要加油学喔~希望能对大家有所帮助。

  • 35
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱吃烤鸡翅的酸菜鱼

希望大家对我多多支持喔~

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

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

打赏作者

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

抵扣说明:

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

余额充值