• 14——1


    这句话的意思是,如图中月份12天数23时,就是1223;当月份9天数2时,就是0902.

    可以看到在上面给出的数组元素中,并没有连续挨在一起的2023数字元素——就有人可能输出答案0。

    所以这里要看一下—— ——子序列的含义:

    子系列的意思是,从数组中选取几个数字

    也就是子系列的数据在原数组中不一定是连续存在的

    例如,我选了第一行的第十个数据元素2,再选第二十五个数据元素0,再选第一行最后一个数据元素2,然后选第二行第十八个数据元素3.

    那么现在我选出来的数据组成的子序列就是——2023.

    这道题数组长度100较大,所以也不能用Excel或计算器啥的凑巧。

    这里写一个搜索代码

    dfs——if(pos)——check——vis——if(mm,dd)

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. //#include<bits/stdc++.h>
    4. //将题目的100个数据放进来
    5. int a[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,
    6. 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,
    7. 0, 0, 9, 4, 8, 0, 9, 1, 2, 8, 5, 0, 2, 5, 3, 3 };//记得有;每个数据元素之间要加,
    8. //思路:求8位日期,且前4位一定是2023
    9. int ans;//统计符合要求的日期数
    10. bool vis[20240000];
    11. bool check(int date)//日期是8位数,不会超出int的位数范围
    12. {
    13. if (vis[date])//这个日期访问过了,排除重复
    14. return false;
    15. vis[date] = 1;//赋值
    16. int mm = date / 100 %100;//把天数去掉/,%提取出来最后两位数月份,因为年数是确切的2023不用看
    17. int dd = date % 100;//提取天数
    18. //排除月份
    19. if (mm < 1 || 12 < mm)//pos4和pos5自由组合的,要排除00,13,19
    20. return false;
    21. //选择天数
    22. if (mm == 1 || mm == 3 || mm == 5 || mm == 7 || mm == 8 || mm == 10 || mm == 12)
    23. {
    24. if (1 <= dd && dd <= 31)
    25. return true;
    26. }
    27. else if (mm == 4 || mm == 6 || mm == 9 || mm == 11)
    28. {
    29. if (1 <= dd && dd <= 30)
    30. return true;
    31. }
    32. else if (mm == 2)
    33. {
    34. if (1 <= dd && dd <= 28)
    35. return true;
    36. }
    37. else//不合法
    38. {
    39. return false;
    40. }
    41. }
    42. void dfs(int x, int pos, int date)
    43. //x是长度100数组中的遍历下标
    44. //pos是指当前的这个长度为8的子系列,遍历到了多长的地方(0~7
    45. //date是形成的日期
    46. {
    47. //判断
    48. if (x == 100)//数组a遍历完了
    49. return;
    50. if (pos == 8)
    51. {
    52. if (check(date))//日期合法且未重复
    53. ++ans;
    54. return;
    55. }
    56. //判断选择子系列(pos4是月份的十位,可能为前导01)
    57. if ((pos == 0 && a[x] == 2) ||
    58. (pos == 1 && a[x] == 0) ||
    59. (pos == 2 && a[x] == 2) ||
    60. (pos == 3 && a[x] == 3) ||
    61. (pos == 4 && 0 <= a[x] && a[x] <= 1) ||
    62. (pos == 5 && 0 <= a[x] && a[x] <= 9) ||
    63. (pos == 6 && 0 <= a[x] && a[x] <= 3) ||
    64. (pos == 7 && 0 <= a[x] && a[x] <= 9))//20234位,有多种类似符号时,带上()更清楚
    65. dfs(x + 1, pos + 1, date * 10 + a[x]);
    66. //不能加{}和else
    67. dfs(x + 1, pos, date);//pos和date不更新就是不选择这个数字进子系列
    68. }
    69. int main(int argc, char* argv[])
    70. {
    71. // 请在此输入您的代码
    72. dfs(0, 0, 0);
    73. printf("%d", ans);
    74. return 0;
    75. }

  • 相关阅读:
    flex布局方法学习
    用DevExpress实现基于HTML&CSS的桌面应用程序的UI(一)
    知识融合介绍
    MySQL基本语句
    springboot整合pi支付开发
    【C++ 初阶】运算符重载详解✌
    Spring框架-IOC
    axios 实战进阶练习( axios 封装篇)——基于 Vue3 + Node.js + ElementPlus 实现的联系人列表管理后台的 axios 封装实战
    关于maven生命周期的理解
    唯众实训授课助手 实训课堂好帮手
  • 原文地址:https://blog.csdn.net/wzdxsa/article/details/134396300