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

· · 题解

日期统计

直接遍历所有的数再判断日期非常繁琐,所以可以考虑遍历 2023 年的所有日期,再在 100 个数中寻找是否能与这些日期相匹配,如果可以对应则答案加一。

void solve(void) {
    int ans = 0;
    int a[101]; for(int i = 1; i <= 100; i++) cin >> a[i]; //用输入的方式读取 100 个数
    int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    for(int m = 1; m <= 12; m++) {
        for(int d = 1; d <= days[m]; d++) {
            int date[] = {2, 0, 2, 3, m / 10, m % 10, d / 10, d % 10};
            int cnt = 0;
            for(int i = 1; i <= 100; i++) {
                if(a[i] == date[cnt]) cnt++;
                if(cnt == 8) {ans++; break;}
            }
        }
    }
    cout << ans << endl;
    //最后答案是 235
}

01 串的熵

由于本题已经把公式告诉我们了,所以只需要在 0\lfloor \frac{23333333}{2}\rfloor 枚举 0 出现的次数就好了。每次枚举后计算一下 H(s) 的值,精度误差与答案在 \pm 0.01 就可以确定答案。

void solve(void) {
    for(int i = 1; i <= 23333333 / 2; i ++) {
        int j = 23333333 - i;
        double h = 0 - (i * (i / 23333333.0) * log2(i / 23333333.0) + j * (j / 23333333.0) * log2(j / 23333333.0));
        if(abs(h - 11625907.5798) < 0.01) {
            cout << i;
            return;
        }
    }
    //答案是 11027421
}