1.填空题日期统计问题描述小蓝现在有一个长度为 100的数组数组中的每个元素的值都在 0 到 9 的范围之内。数组中的元素从左至右如下所示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现在他想要从这个数组中寻找一些满足以下条件的子序列子序列的长度为 8这个子序列可以按照下标顺序组成一个 yyyymmdd格式的日期并且要求这个日期是 2023 年中的某一天的日期例如 2023090220231223。yyyy 表示年份mm 表示月份dd 表示天数当月份或者天数的长度只有一位时需要一个前导零补充。请你帮小蓝计算下按上述条件一共能找到多少个不同的 2023 年的日期。对于相同的日期你只需要统计一次即可。题解#includebits/stdc.h using namespace std; int main(){ int a[100]; for(int i0;i100;i){ cina[i]; } int daysinmonth[13]{0,31,28,31,30,31,30,31,31,30,31,30,31}; int ans0; for(int month1;month12;month){ for(int day1;daydaysinmonth[month];day){ int date[8]{2,0,2,3,month/10,month%10,day/10,day%10}; int k0; for(int i0;i100;i){ if(a[i]date[k]){ k; if(k8){ ans; break; } } } } } coutans; return 0; }注意填空题不用写这么多只要输出一个运行出来的答案即可。题解的解析daysinmonth代表的是2023年每个月有多少天其中为了好辨认从a[1]开始记作一月的天数此后以此类推date[8]是因为题目要求子序列的长度为8位。例如month1和day1时date[8]{2,0,2,3,0,1,0,1};break出现时整个for(int i0;i100;i)停止然后下一步是day再接着重新运行for(int i0;i100;i)2.编程题接龙数列问题描述对于一个长度为 K 的整数数列A1,A2,…,AK我们称之为接龙数列当且仅当 Ai​ 的首位数字恰好等于 Ai−1 的末位数字 (2≤i≤K)(2≤i≤K)。例如 12,23,35,56,61,11 是接龙数列12,23,34,56不是接龙数列因为 56 的首位数字不等于 34 的末位数字。所有长度为 1的整数数列都是接龙数列。现在给定一个长度为 N的数列 A1,A2,…,AN请你计算最少从中删除多少个数可以使剩下的序列是接龙序列输入格式第一行包含一个整数 N。第二行包含 N 个整数 A1,A2,…,AN。输出格式一个整数代表答案。样例输入511 121 22 12 2023输出1题解#includebits/stdc.h using namespace std; int dp[10]; int main(){ int n; cinn; string s; int m0; for(int i0;in;i){ cins; int xs[0]-0,ys[s.size()-1]-0; dp[y]max(dp[x]1,dp[y]); mmax(m,dp[y]); } coutn-m; return 0; }个人对题解的理解本题解采用了动态规划dp个人觉得最关键的一步是dp[y]max(dp[x]1,dp[y]);dp[i]代表的是到目前为止以数字 i 结尾的最长接龙子序列的长度。因为一开始一个数都没看过所以全是 0。首先每次输入的s都会把前面输入的s覆盖掉。因此x一定是每次输入数字的首位y一定是每次输入数字的末位。然后到了我感觉最难理解的dp[y]max(dp[x]1,dp[y]);。例如输入12 23刚开始的时候x1,y2得到dp[2]1这里可以看出来以2结尾的序列长度为1。接着是23x2,y3得到dp[3]2这里可以看出来以3结尾的序列长度为2.接着m负责的是求出最长接龙子序列的长度。最后n-m为总的长度-最长接龙子序列的长度删除的个数2.编程题子串简写问题描述程序猿圈子里正在流行一种很新的简写方法对于一个字符串只保留首尾字符将首尾字符之间的所有字符用这部分的长度代替。例如 internation-alization 简写成 i18nKubernetes 注意连字符不是字符串的一部分简写成 K8s, Lanqiao 简写成 L5o 等。在本题中我们规定长度大于等于 K 的字符串都可以采用这种简写方法长度小于 K 的字符串不配使用这种简写。给定一个字符串 S 和两个字符 c1​ 和 c2​ 请你计算 S 有多少个以 c1 开头 c2 结尾的子串可以采用这种简写输入格式第一行包含一个整数 K。第二行包含一个字符串 S 和两个字符 c1 和 c2​。输出格式一个整数代表答案。样例输入4abababdb a b输出6题解#includebits/stdc.h using namespace std; int main(){ int k; cink; string s; cins; char c1,c2; cinc1c2; int ans0,count0; for(int i0;is.size();i){ if(i-k10s[i-k1]c1){ count; } if(s[i]c2){ anscount; } } coutans; return 0; }int可以尽量换成long long对题解的理解首先看第一个if。第一次对count进行加加代表的是 有一个符合长度为k的序列且满足此序列第一个字符等于c1。第二次对count进行加加代表的是 有两个符合长度为k的序列且满足每一个序列的第一个字符等于c1。此后以此类推。然后看第二个if。此if代表的是在长度为k的情况下最后一个字符为c2。在这样一个相同的if情况下前面有多少个c1那么我们求出的个数就有多少个再以此累加即可得到最终结果。