第十五届蓝桥杯软件赛模拟赛第三期(c++,python,java通用)
后台-插件-广告管理-内容页头部广告(手机) |
注:1.填空题用最简单的方式(暴力递归或枚举)得出答案即可。
2.编程题若无思路可用暴力递归或枚举也能拿到不少的分数。
第一题
【问题描述】
请问 2023 有多少个约数?即有多少个正整数,使得 2023 是这个正整数的整数倍。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【思路】简单模拟
【代码】
- #include
- using namespace std;
- int main(){
- int res = 0;
- for(int i = 1;i<=2023;i++){
- if(2023 % i == 0) res++;
- }
- cout << res << endl;
- }
答案:6
第二题
【问题描述】
请问有多少组整数对 l, r 满足:
1. l 和 r 都介于 0(含)到 100(含)之间;
2. r-l >= 10。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【思路】简单模拟
【代码】
- #include
- using namespace std;
- int main(){
- int res = 0;
- for(int i = 0;i<=90;i++)
- for(int j = i+10;j<=100;j++)
- if(j - i>= 10) res++;
- cout << res << endl;
- }
答案:4186
第三题
【问题描述】
只能被 1 和本身整除的数称为质数。
请问在 1 (含)到 1000000 (含)中,有多少个质数的各个数位上的数字之和为 23 。
提示:599 就是这样一个质数,各个数位上的数字之和为 5+9+9=23 。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【思路】简单模拟,若对拆解数字的每一位不熟悉可以参考 AcWing第466题 / NOIP2016普及组《回文日期》
【代码】
- #include
- #include
- using namespace std;
- //判断质数
- bool is_prime(int num){
- for(int i = 2;i<=sqrt(num);i++){
- if(num % i == 0) return false;
- }
- return true;
- }
- //计算每一位的和
- int sum(int num){
- int temp = 0;
- while(num){
- temp += num %10;
- num /= 10;
- }
- return temp;
- }
- int main(){
- int res = 0;
- for(int i = 1;i<=1000000;i++){
- if(is_prime(i) && sum(i) == 23) res++;
- }
- cout << res << endl;
- return 0;
- }
答案:5503
第四题
【问题描述】
求 12345678901234567890123456789012345678901234567890 除以 2023 的余数。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【思路】高精度除法,此题推荐使用python解决,若用C++解决则参考【模板】AcWing. 794《高精度除法》
【代码】
- //Python代码
- a = 12345678901234567890123456789012345678901234567890
- print(a%2023)
- //c++为高精度除法,参考上文所提到博客
答案:344
第五题
【问题描述】
对于一个 n 行 m 列的矩阵,它的一个 k 行 k 列的子矩阵是指由矩阵中的连续 k 行、连续 k 列组 成的矩阵。子矩阵的和是指子矩阵中所有元素的和。现在,小蓝对于一个矩阵中的子矩阵中最大 的子矩阵的和很感兴趣。例如,对于如下 3 行 4 列的矩阵,2 行 2 列的子矩阵的和的最大值是8,对应的子矩阵为由最后两行最后两列组成的子矩阵。
- 2 0 2 3
- 1 1 0 1
- 1 2 3 4
现在,小蓝有一个 30 行 20 列的大矩阵,如下所示,请问它的 5 行 5 列的子矩阵的和的最大值 是多少?
- 9719 7515 5916 6467 7157 9614 8560 9075 2099 2838 1403 7652 6238 1699 8907 1804 5384 7942 7546 1978
- 8785 1944 8108 6040 2010 6646 2750 5410 4516 8757 5624 9257 9030 9290 6833 4646 9749 5304 5633 1573
- 8525 8244 8514 7474 7896 9731 8402 9036 1869 2688 2085 1667 7753 8466 4911 3812 8585 8319 4020 7350
- 1949 9120 4424 4057 8277 4511 6333 1533 7624 8932 1053 8682 9284 4134 1466 3607 8753 5310 3728 4163
- 9420 9185 7055 2342 4143 4499 2036 5374 7026 8638 8866 8364 1706 8767 1601 8309 5695 8179 4142 8489
- 5876 5660 4658 8307 2582 7544 8793 8207 3979 1692 1400 1893 4500 6389 7198 4836 4761 6603 2859 1312
- 6367 4174 9956 6668 6771 4795 6492 3937 7096 8041 8644 9379 8071 8667 5810 5794 8147 3823 7877 4822
- 4809 3297 8518 4972 9754 6854 3271 7891 8882 1052 3197 6035 5628 7674 7931 8085 8970 7733 4745 8785
- 7536 1511 6964 4763 5409 7032 8963 8576 3411 5853 3316 1267 7851 2735 6953 2970 1810 6830 5576 6903
- 2241 1575 2379 4679 9519 9290 4802 1562 3509 8365 6777 5143 5610 1061 7880 1935 5793 7023 5629 9571
- 2480 5937 4612 8890 1964 8532 3309 9737 8507 1849 8544 1500 9282 6288 2137 4730 4239 3473 4643 6377
- 7341 2881 3430 5815 1972 6629 3817 4547 7561 4779 6578 6114 4972 5505 7515 1800 4784 2272 4502 7541
- 7665 8607 2022 8192 2605 1346 4155 8725 8167 7022 6136 3615 6057 6329 8671 2033 3151 2249 5981 6412
- 9046 3353 8650 6965 4179 1248 5659 5219 8083 5615 3821 4436 9217 7356 3914 5717 3734 3765 4435 7210
- 8951 5013 2951 7401 2329 5686 6530 9581 6539 6881 8634 2663 2916 3019 8529 5645 8201 9270 1939 7275
- 6429 1531 6322 9586 2793 7968 4001 9665 7624 4369 6245 5146 9567 6801 6064 6199 3210 6753 2586 7795
- 5771 8507 7973 1470 1475 6896 6781 6572 8412 8557 8255 5268 8960 7251 9214 2489 6920 9917 3810 4605
- 9116 7950 3715 1697 4703 2868 8673 3106 2579 1074 3992 3547 4279 3149 3396 6081 6221 1125 9358 2471
- 8360 1526 4116 9278 6325 5175 5533 4107 7522 7599 7711 9211 1752 2431 8321 3844 3579 1047 3987 8487
- 7600 2401 8748 8945 2078 1519 4614 4576 5706 4040 9358 1928 1327 6699 5258 2846 3418 8310 1249 3866
- 7796 8668 4087 4258 8992 8996 4617 5997 2527 8204 8927 1456 9340 2088 1605 2299 9878 8347 7789 2122
- 8372 1102 4243 4208 1651 7861 4947 7802 4704 6204 4455 6012 8494 9060 3747 2786 2136 1830 7424 8309
- 6919 4420 2031 5399 2652 7219 4048 7013 5094 5276 4225 5976 4157 6722 8765 4679 1604 4986 5033 2623
- 4015 2297 3067 6261 6623 4577 4589 4747 6659 7667 7853 4040 6393 9606 7219 9334 1316 3430 9963 5187
- 4998 3735 9884 2990 1374 8436 6674 3018 5714 9352 8708 8789 7879 2965 1444 4671 4743 9817 6066 8057
- 6996 9609 2884 4601 7287 3432 4145 8858 6857 8624 4531 6579 1615 2894 4521 3274 5237 1093 3317 9289
- 7117 1850 3210 8010 2512 1394 4718 9332 5593 4118 4995 3994 5063 9426 1709 5128 4997 9287 1907 9068
- 4258 7328 6490 2603 5333 5093 8070 2116 8489 1994 7098 7409 1463 4268 9509 2358 1192 2460 5031 6292
- 4911 1192 1012 2494 5276 8981 3540 3306 8869 6678 7879 7526 8847 6270 7653 3109 6955 9760 8520 8673
- 6328 7277 7818 3285 9398 4929 4639 1617 4023 1051 9320 4955 6580 6481 3824 9611 2863 6492 6281 6203
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【思路】双层循环暴力枚举或者二维前缀和
【代码】
- //第一种:双层循环暴力枚举
- #include
- using namespace std;
- const int n = 30,m= 20;
- int a[n][m];
- long long res;
- int count(int x,int y){
- int tmp = 0;
- for(int i = x;i < x + 5 ;i++){
- for(int j = y;j < y + 5;j++){
- tmp += a[i][j];
- }
- }
- return tmp;
- }
- int main(){
- int res = 0;
- for(int i = 0 ;i
- for(int j = 0;j
- cin >> a[i][j];
- }
- }
- for(int i = 0;i<=25;i++){
- for(int j = 0;j<=15;j++){
- res = max(res,count(i,j));
- }
- }
- cout << res << endl;
- }
- //第二种:二维前缀和
- #include
- using namespace std;
- typedef long long LL;
- int a[31][21];
- LL s[31][21];
- int main(){
- int res = 0;
- for(int i = 0 ;i<30;i++)
- for(int j = 0;j<20;j++)
- cin >> a[i][j];
- for(int i = 0;i<=30;i++){
- for(int j = 0;j<=20;j++){
- s[i][j] = s[i-1][j] + s[i][j-1] - s[i-1][j-1] + a[i][j];
- }
- }
- for(int i = 5;i<=30;i++){
- for(int j = 5;j<=20;j++){
- int tmp = s[i][j] - s[i-5][j] - s[i][j-5] + s[i-5][j-5];
- if(tmp > res) res = tmp;
- }
- }
- cout << res << endl;
- }
- for(int j = 0;j
答案:171248
第六题
【问题描述】
小蓝要上一个楼梯,楼梯共有 n 级台阶(即小蓝总共要走 n 级)。小蓝每一步可以走 1 级、2 级 或 3 级台阶。
请问小蓝至少要多少步才能上到楼梯顶端?
【输入格式】
输入一行包含一个整数 n 。
【输入格式】
输出一行包含一个整数,表示答案。
【输入样例】
9
【输出样例】
3
【数据范围】
对于所有评测用例,1 <= n <= 10000 。
【思路】简单模拟
【代码】
- #include
- using namespace std;
- int main(){
- int n;
- cin >> n;
- if(n % 3 == 0) cout << n/3 << endl;
- else cout << n/3 + 1 << endl;
- }
第七题
【问题描述】
给定一个仅包含数字字符的字符串,请统计一下这个字符串中出现了多少个值为奇数的数位。
【输入格式】
输入一行包含一个字符串,仅由数字字符组成。
【输入格式】
输出一行包含一个整数,表示答案。
【输入样例1】
123455
【输出样例1】
4
【输入样例2】
111222333111222333111222333
【输出样例2】
18
【数据范围】
对于所有评测用例,1 <= 字符数量 <= 10000。
【思路】简单模拟
【代码】
- #include
- #include
- using namespace std;
- const int N = 10010;
- char str[N];
- int res,tmp;
- int main(){
- scanf("%s",str);
- int len = strlen(str);
- for(int i = 0;i
- tmp = str[i] - '0';
- if(tmp % 2) res ++;
- }
- cout << res << endl;
- }
第八题
【问题描述】
对于一个序列 a[1], a[2], …, a[n],如果 a[i] 满足 a[i]a[i+1],则称 a[i] 是一个极大值。给定一个序列,请找到极小值中最大的和极大值中最小的。
【输入格式】
输入的第一行包含一个整数 n ,表示序列的长度。
第二行包含 n 个整数,相邻的整数之间使用一个空格分隔,表示给定的序列。
【输出格式】
输出一行包含两个整数,用一个空格分隔,分别表示极小值中最大的和极大值中最小的。输入保 证至少存在一个极小值,至少存在一个极大值。
【输入样例】
8
1 8 2 4 4 3 5 3
【输出样例】
3 5
【数据范围】
对于所有评测用例,1 <= n <= 1000,0 <= a[i] <= 10000。
【思路】简单模拟
【代码】
- #include
- #include
- using namespace std;
- const int N = 1010,INF = 10000;
- int n,a[N];
- int main(){
- scanf("%d",&n);
- int maxv = INF,minv = -INF;
- for(int i = 0;i
> a[i]; - for(int i = 1;i
-1;i++) { - if(a[i] < a[i-1] && a[i] < a[i+1]) minv = max(minv,a[i]);
- else if(a[i] > a[i-1] && a[i] > a[i+1]) maxv = min(maxv,a[i]);
- }
- cout << minv << " " << maxv << endl;
- }
第九题
【问题描述】
对于一个字符矩阵,其中的一些字符构成字母 Y 是指存在一个中间字符,从这个中间字符向下、 向左上(45度)、向右上(45度)的字符都与中间的字符相同。
字母 Y 的长度指同时向 3 个方向的相同字母延伸的最大距离。
例如,下图中所有的 1 组成一个字母 Y,长度为 3。
又如,下图中以第 5 行第 6 列为中心也构成一个字母 Y (由字符 A 构成),长度为 1 。
再如,下图中以第 4 行第 3 列为中心也构成一个字母 Y (由字符 0 构成),长度为 2 。
- 1000001
- 0100010
- 0010100
- 0001AAA
- 00010A0
- 00010A0
- 00010A0
给定一个字符矩阵,请找出能构成字母 Y 的最大长度,如果无法构成字母 Y,请输出 0 。
【输入格式】
输入的第一行包含两个整数 n, m ,用一个空格分隔,表示字符矩阵的行数和列数。
接下来 n 行,每行包含 m 个字符,表示字符矩阵。
【输出格式】
输出一行包含两个整数,用一个空格分隔,分别表示极小值中最大的和极大值中最小的。输入保 证至少存在一个极小值,至少存在一个极大值。
【输入样例】
- 7 7
- 1000001
- 0100010
- 0010100
- 0001AAA
- 00010A0
- 00010A0
- 00010A0
【输出样例】
3
【数据范围】
对于50%的评测用例,1 <= n, m <= 100。
对于所有评测用例,1 <= n, m <= 1000,字符矩阵中仅包含数字字符和大写英文字母。
【思路】简单模拟
【代码】
- #include
- using namespace std;
- const int N = 1010;
- char a[N][N];
- int n,m;
- int max_num(int i,int j){
- int tmp = 0;
- //三个方向坐标的值
- int left_x = i-1,left_y = j-1;
- int right_x = i-1,right_y = j+1;
- int bottom_x = i+1;
- while(left_x >=0 && left_y >= 0 && right_x >=0 && right_y < m
- && bottom_x < n && a[i][j] == a[left_x][left_y] &&
- a[i][j] == a[right_x][right_y] && a[i][j] == a[bottom_x][j]){
- tmp++;
- left_x--,left_y--;
- right_x--,right_y++;
- bottom_x++;
- }
- return tmp;
- }
- int main(){
- scanf("%d%d",&n,&m);
- int res = 0;
- for(int i= 0;i
- for(int j = 0;j
- cin >> a[i][j];
- }
- }
- //时间复杂度为O(nm)约为10的6次方,应该可以通过全部测试样例
- for(int i = 1;i
-1;i++){ - for(int j = 1;j
-1;j++){ - res = max(res,max_num(i,j));
- }
- }
- cout << res << endl;
- return 0;
- }
- for(int j = 0;j
第十题
【问题描述】
小蓝要上一个楼梯,楼梯共有 n 级台阶(即小蓝总共要走 n 级)。小蓝每一步可以走 a 级、b 级 或 c 级台阶。
请问小蓝总共有多少种方案能正好走到楼梯顶端?
【输入格式】
输入的第一行包含一个整数 n 。
第二行包含三个整数 a, b, c 。
【输出格式】
输出一行包含一个整数,表示答案。答案可能很大,请输出答案除以 1000000007 后的余数。
【输入样例1】
4
1 2 3
【输出样例1】
7
【输入样例2】
7
2 4 6
【输出样例2】
0
【数据范围】
对于 30% 评测用例,1 <= a < b < c <= n <= 50。
对于 60% 评测用例,1 <= a < b < c <= n <= 1000。
对于所有评测用例,1 <= a < b < c <= n <= 1000000。
【思路】线性DP
状态表示:dp[i] 表示走到第 i 级台阶的方式总数
状态转移:dp[i] = dp[i-a] + dp[i-b] + dp[i-c]
【代码】
- #include
- using namespace std;
- const int N = 1000010;
- int n,a,b,c;
- int dp[N];
- //int的范围大约是21亿,这里定义为int型不会超范围
- int mod = 1000000007;
- int main() {
- scanf("%d%d%d%d",&n,&a,&b,&c);
- dp[0] = 1;
- //时间复杂度为O(n)约为10的6次方,应该可以通过全部测试用例
- for (int i = 1; i <= n; i++) {
- if (i >= a) dp[i] = (dp[i] + dp[i - a])%mod;
- if (i >= b) dp[i] = (dp[i] + dp[i - b])%mod;
- if (i >= c) dp[i] = (dp[i] + dp[i - c])%mod;
- }
- cout << dp[n] << endl;
- return 0;
- }
若以上内容若有错误或者不足,请在评论中或私信指出。
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。
在线投稿:投稿 站长QQ:1888636
后台-插件-广告管理-内容页尾部广告(手机) |