题解:P9239 [蓝桥杯 2023 省 B] 填空问题

试题 A:日期统计

这道题目我们直接暴力枚举就好了。

什么?你说会超时?这道题目又不是常规题目,只要提交答案就好了,超时也没什么,总不至于算都算不出来吧

注意:枚举的时候要注意细节。不要因为细节把自己心态搞炸

代码实现

#include<bits/stdc++.h>
using namespace std;
int a[105],tmp,sum,tmp2,mon[15]={0,31,28,31,30,31,30,31,31,30,31,30,31},n=100;//初始定义,并且将月份天数储存下来(索引从1起)
set<int> dates;
int main()
{
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            for(int k=j+1;k<=n;k++)
            {
                for(int l=k+1;l<=n;l++)
                {
                    tmp=a[i]*1000+a[j]*100+a[k]*10+a[l];
                    if(tmp!=2023) continue;//若月份不为2023,直接跳过
                    for(int i1=l+1;i1<=n;i1++)
                    {
                        if(a[i1]!=0&&a[i1]!=1) continue;//月份第一位必定为0或1
                        for(int i2=i1+1;i2<=n;i2++)
                        {
                            sum=a[i1]*10+a[i2];
                            if(sum<1||sum>12) continue;//检查月份是否合法
                            for(int i3=i2+1;i3<=n;i3++)
                            {
                                for(int i4=i3+1;i4<=n;i4++)
                                {
                                    tmp2=a[i3]*10+a[i4];
                                    if(tmp2>=1&&tmp2<=mon[sum]) dates.insert(20230000 + sum*100 + tmp2);//检查天数是否合法,若合法计入答案集合
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    printf("%d",dates.size());//输出答案
    return 0;
}
    

最终答案:\(235\)

试题 B:01 串的熵

写完了看了一下题解区,发现好多直接套公式的。其实这道题目根本不用直接套公式,套公式反而还麻烦一些。

我们依旧是枚举 \(0\) 的数量,通过 \(0\) 的数量确定 \(1\) 的数量。但是在答案更新上有大不同。

我认为直接套题目给的公式很麻烦,这里给出一个推柿子使得题目更加简单的做法(推完之后发现题解区有个跟我柿子推得差不多的)。

柿子推了一个晚上
应该是自己太蒻了,其实柿子很好推。

  • \(H(S)=-\sum_{i=1}^np(x_i) \log2(p(x_i))\)
  • \(H(S)=-\sum_{i=1}^n([x_i=1]\frac{n_1}{n}\log2(\frac{n_1}{n})+[x_i=0]\frac{n_0}{n}\log2(\frac{n_0}{n}))\)
  • \(H(S)=-(n_1\frac{n_1}{n}\log2(\frac{n_1}{n})+n_0\frac{n_0}{n}\log2(\frac{n_0}{n}))\)
  • \(H(S)=-(\frac{{n_1}^2}{n}\log2(\frac{n_1}{n})+\frac{{n_0}^2}{n}\log2(\frac{n_0}{n}))\)

那么,最后的就是公式了。我们枚举 \(n_0\) 的情况,然后将公式套进去,将得出的结果与以前的结果比较,最后得到的就是最接近的答案了。

#include<bits/stdc++.h>
using namespace std;
int n=23333333,ans1;
double shang=11625907.5798,ans2;
int main()
{
    for(int i=0;i<=n;i++)
    {
        int j=n-i;
        double tmp=-(j*1.0*j/n*log2(j*1.0/n)+i*1.0*i/n*log2(i*1.0/n));//套公式
        if(abs(tmp-shang)<abs(ans2-shang))//更新最接近的值
        {
            ans2=tmp;
            ans1=i;
        }
    }
    printf("%d",ans1);//输出答案
    return 0;
}

最终答案:\(11027421\)

AC 代码

记录

#include<iostream>
using namespace std;
int main() {
    string ans [] = {
        "235",
        "11027421",
    };
    char T;
    cin >> T;
    cout << ans[T - 'A'] << endl;
    return 0;
}
posted @ 2025-11-15 11:18  linruicong  阅读(5)  评论(0)    收藏  举报