小工具知识网

当前位置: 首页 > 行业知识 > 第十四届蓝桥杯大赛软件赛省赛(C/C++ 大学B组)

行业知识

第十四届蓝桥杯大赛软件赛省赛(C/C++ 大学B组)

2026-11-14 23:24:00 来源:互联网转载

蓝���杯 2023年省赛真题
C/C++ 大学B组

  • 试题 A: 日期统计
  • 试题 B: 01 串的熵
  • 试题 C: 冶炼金属
  • 试题 D: 飞机降落
  • 试题 E: 接龙数列
  • 试题 F: 岛屿个数
  • 试题 G: 子串简写
  • 试题 H: 整数删除
  • 试题  I: 景区导游
  • 试题 J: 砍树

    要来力

    ()

    试题 A: 日期统计

    本题总分: 5 5 5 分


    【问题描述】

      小蓝现在有一个长度为 100 100 100 的数组,数组中的每个元素的值都在 0 0 0 到 9 9 9 的范围之内。数组中的元素从左至右如下所示:

       5 5 5 6 6 6 8 8 8 6 6 6 9 9 9 1 1 1 6 6 6 1 1 1 2 2 2 4 4 4 9 9 9 1 1 1 9 9 9 8 8 8 2 2 2 3 3 3 6 6 6 4 4 4 7 7 7 7 7 7 5 5 5 9 9 9 5 5 5 0 0 0 3 3 3 8 8 8 7 7 7 5 5 5 8 8 8 1 1 1 5 5 5 8 8 8 6 6 6 1 1 1 8 8 8 3 3 3 0 0 0 3 3 3 7 7 7 9 9 9 2 2 2 7 7 7 0 0 0 5 5 5 8 8 8 8 8 8 5 5 5 7 7 7 0 0 0 9 9 9 9 9 9 1 1 1 9 9 9 4 4 4 4 4 4 6 6 6 8 8 8 6 6 6 3 3 3 3 3 3 8 8 8 5 5 5 1 1 1 6 6 6 3 3 3 4 4 4 6 6 6 7 7 7 0 0 0 7 7 7 8 8 8 2 2 2 7 7 7 6 6 6 8 8 8 9 9 9 5 5 5 6 6 6 5 5 5 6 6 6 1 1 1 4 4 4 0 0 0 1 1 1 0 0 0 0 0 0 9 9 9 4 4 4 8 8 8 0 0 0 9 9 9 1 1 1 2 2 2 8 8 8 5 5 5 0 0 0 2 2 2 5 5 5 3 3 3 3 3 3

      现在他想要从这个数组中寻找一些满足以下条件的子序列:

    ()

      1. 子序列的长度为 8 8 8;

      2. 这个子序列可以按照下标顺序组成一个 y y y y m m d d \rm yyyymmdd yyyymmdd 格式的日期,并且要求这个日期是 2023 2023 2023 年中的某一天的日期,例如 20230902 20230902 20230902, 20231223 20231223 20231223。 y y y y \rm yyyy yyyy 表示年份, m m \rm mm mm 表示月份, d d \rm dd dd 表示天数,当月份或者天数的长度只有一位时需要一个前导零补充。

      请你帮小蓝计算下按上述条件一共能找到多少个不同的 2023 2023 2023 年的日期。对于相同的日期你只需要统计一次即可。

    【答案提交】

      这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。


    235


      枚举长度为 8 8 8的子序列复杂度直接炸裂,不过考虑到日期前缀为 2023 2023 2023且唯一,因为找到 2023 2023 2023第一次出现的位置截断后枚举长度为 4 4 4的子序列与 2023 2023 2023年的合法日期取交集即可。

    #include char *A = "5686916124919823647759503875815861830379270588570991944686338516346707827689565614010094809128502533";char *prefix = "2023";int n = 100, m = 0, ds[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };std::set subs[4], target;std::vector ans;int main() {    for (int k = 0; k = 0; --i)            for (int sb : subs[i])                subs[i + 1].insert(sb * 10 + A[m] - '0');        subs[0].insert(A[m] - '0');    }    for (int m = 1; m     for (double i = 0, j = n; i             printf("%.0lf", i);            return 0;        }}Vimax​},因为取最大值可能会使                                             ⌊                                                                A                                     i                                                           V                                     i                                                             ⌋                                                                     B                            i                                       \left\lfloor\cfrac{A_i}{V_i}\right\rfloorB_i                  ⌊Vi​Ai​​⌋Bi​成立,同理最小的                                   V                              V                  V取                                   max                         ⁡                         {                                   V                            i                                       m                               a                               x                                            }                              \max\{V_i^{max}\}                  max{Vimax​}。

    对于 A A A、 B B B我们取 ⌊ A B ⌋ \left\lfloor\cfrac{A}{B}\right\rfloor ⌊BA​⌋做 V m a x V^{max} Vmax,当 A = V B A=VB A=VB时 V V V的取值唯一,显然成立,否则 ⌈ A B ⌉ = V m a x + 1 \left\lceil\cfrac{A}{B}\right\rceil = V^{max} + 1 ⌈BA​⌉=Vmax+1,当取 V m a x + 1 V^{max} + 1 Vmax+1做 V V V时带入 ⌊ A V ⌋ = ⌊ B ( V − 1 ) + A ′ V ⌋

上一篇:怎么在浏览器连接服务器?

下一篇:方舟生存进化下载指南