小言_互联网的博客

2022蓝桥杯省赛C++A组初尝试

388人阅读  评论(0)

前言

耗时三个半小时,看看自己不懂的有多少,以便明确后续备赛2023方向

耗时3个半小时,只拿了18分,没学过,时间再多也做不出来,有奥数那感觉了 

据说蓝桥杯省3得做对 2填空 + 2大题(30分),省2要 2填空 + 3大题(45分),省1需要 2填空 + 4大题(60分)

题目

1,2021: [蓝桥杯2022初赛] 裁纸刀        耗时10分钟,到手5分

题目

小蓝有一个裁纸刀,每次可以将一张纸沿一条直线裁成两半。
小蓝用一张纸打印出两行三列共 6 个二维码,至少使用九次裁出来,下图给出了一种裁法

在上面的例子中,小蓝的打印机没办法打印到边缘,所以边缘至少要裁4次。
另外,小蓝每次只能裁一张纸,不能重叠或者拼起来裁。
如果小蓝要用一张纸打印出 20 行 22 列共 440 个二维码,他至少需要裁多少次? 

分类:入门题,模拟

我的代码          

口口口   此时行数n = 2, 列数m = 3, 由题目可知第一步裁掉边缘要4次
口口口

IIIIIIIIII>>>>>>   第二步:竖着裁成这样子

口    口    口
口    口    口      要裁 4 + 2 次,2 = m - 1,第三步:

口    口    口

口    口    口  把每条裁开,要裁 4 + 2 + 3 次,3 = m(n - 1)

再在草稿纸上画出n = 3, m = 4裁掉的过程,可以验证正确

∴ 一共要裁 4 + (m - 1) + m(n - 1) = mn + 3 次,代入n = 20, m = 22可得443

2,2022: [蓝桥杯2022初赛] 灭鼠先锋        耗时50分钟,到手5分

题目

灭鼠先锋是一个老少咸宜的棋盘小游戏,由两人参与,轮流操作。
灭鼠先锋的棋盘有各种规格,本题中游戏在两行四列的棋盘上进行。
游戏的规则为:两人轮流操作,每次可选择在棋盘的一个空位上放置一个棋子,或在同一行的连续两个空位上各放置一个棋子,放下棋子后使棋盘放满的一方输掉游戏
小蓝和小乔一起玩游戏,小蓝先手,小乔后手。小蓝可以放置棋子的方法很多,通过旋转和翻转可以对应如下四种情况:
 

XOOO XXOO OXOO OXXO
OOOO OOOO OOOO OOOO

其中 O 表示棋盘上的一个方格为空,X 表示该方格已经放置了棋子。
请问,对于以上四种情况,如果小蓝和小乔都是按照对自己最优的策略来玩游戏,小蓝是否能获胜。
如果获胜,请用 V 表示,否则用 L 表示。
请将四种情况的胜负结果按顺序连接在一起提交。
这是一道结果填空的题,你只需要算出结果后输出即可。
本题的结果为一个长度为 4 的由大写字母 V 和 L 组成的字符串,如 VVLL,在提交答案时只需输出这个字符串

分类:基础题,博弈

我的代码          

         首先小蓝先手(看草稿纸,假设小蓝为o,小乔为x),两行四列共8格子,所以当一次放 2 棋子的次数为0,2,4时,必然小乔放满结束游戏,此时小蓝赢。由于都有最优策略,4次 2 棋子的情况不会有,所以注意0次2棋子和2次2棋子即可。

        然后我对照着四种情况,假设自己是小乔,努力找小蓝必输的情况,所有情况试一遍找不到小蓝必输,则默认必赢,也就是V。同时,基于上面找到的规律,小蓝下一步棋子我可以往后看3步,大大节省了时间。同时注意 2棋子 只能放于同一行连续两个,这又是个限制条件,只需占据中间两竖即可限制对方。

        所以最后推出LLLV

3,2023: [蓝桥杯2022初赛] 求和        耗时20分钟,到手7分 

题目

给定n个整数a[1],a[2],...,a[n],求两两相乘再相加的和,即
S=a[1]·a[2]+a[1]·a[3]+...+a[1]·a[n]+a[2]·a[3]+...+a[2]·a[n]+...+a[n-1]·a[n]

输入

第一行为正整数n,第二行为n个整数。
30%的数据:2≤n≤1000,1≤a[i]≤100。
100%的数据:2≤n≤200000,1≤a[i]≤1000。

输出

输出一个数字表示答案S。

输入


  
  1. 4
  2. 1 3 6 9

输出

117

分类:基础题,思维题 

我的代码          Accepted 70%   


  
  1. #include<iostream>
  2. using namespace std;
  3. int a[ 200020];
  4. int main()
  5. {
  6. int n;
  7. cin>>n;
  8. for( int i = 0; i < n; ++i)
  9. cin>>a[i];
  10. long long sum = 0;
  11. for( int i = 0; i < n - 1; ++i)
  12. for( int j = i + 1; j < n; ++j) {
  13. sum = sum + a[i] * a[j];
  14. }
  15. cout<<sum<<endl;
  16. return 0;
  17. }

别人代码 Accepted 100%


  
  1. #include<iostream>
  2. using namespace std;
  3. int a[ 200020];
  4. int main()
  5. {
  6. int n;
  7. cin>>n;
  8. for( int i = 0; i < n; ++i)
  9. cin>>a[i]; //输入数组
  10. long long sum = 0, temp = 0;
  11. for( int i = 0; i < n; ++i) {
  12. sum += temp * a[i];
  13. temp += a[i]; //保存上一个数据
  14. } //通过中间变量temp,我们不用打两层for循环
  15. cout<<sum<<endl;
  16. return 0;
  17. }

4,2024: [蓝桥杯2022初赛] 选数异或        耗时2小时,到手1分

题目

给定一个长度为 n 的数列A1,A2,... , An 和一个非负整数 x
给定 m 次查询, 每次询问能否从某个区间 [l, r] 中选择两个数使得他们的异或等于 x

输入

输入第一行包含三个整数n,m,x
第二行包含n个整数A1,A2,...,An
接下来m行,每行两个整数l,r表示询问区间[l, r]
20%的测试数据:1≤n,m≤100;
40%的测试数据:1≤n,m≤1000;
100%的测试数据:1≤n,m≤100000,0≤x,Ai<2^20,1≤l≤r≤n;

输出

对于每个询问, 如果该区间内存在两个数的异或为 x 则输出yes, 否则输出no

输入


  
  1. 4 4 1
  2. 1 2 3 4
  3. 1 4
  4. 1 2
  5. 2 3
  6. 3 3

输出


  
  1. yes
  2. no
  3. yes
  4. no

分类:进阶题,线段树,ST表 

我的代码  Accepted 10%  


  
  1. #include<iostream>
  2. using namespace std;
  3. int a[ 100010];
  4. int main()
  5. {
  6. long long n, m, x; //n个整数, m行查询, 能否异或等于x
  7. cin>>n>>m>>x;
  8. long long left, right;
  9. for( int i = 1; i <= n; ++i)
  10. cin>>a[i]; //输入n个整数
  11. while(m) {
  12. int flag = 1;
  13. cin>>left>>right; //表示区间[left, right]
  14. for( int i = left; i < right; ++i) { //外层for
  15. int temp = a[i]^x;
  16. for( int j = i + 1; j <= right; ++j) { //内层for
  17. if(temp == a[j]) {
  18. cout<< "yes"<<endl;
  19. flag = 0;
  20. }
  21. } //内层for
  22. if(i == right - 1 && flag == 1) //遍历完且未输出yes
  23. cout<< "no"<<endl;
  24. } //外层for
  25. m--;
  26. //补充两个整数相等的情况
  27. if(left == right && x == 0)
  28. cout<< "yes"<<endl;
  29. if(left == right && x != 0)
  30. cout<< "no"<<endl;
  31. }
  32. return 0;
  33. }

解题基本思路是

若 a^b == x,则 a^x == b 且 b^x == a


  
  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int a = 3^ 5;
  6. int b = a^ 3;
  7. int c = a^ 5;
  8. cout<<b<<endl<<c<<endl;
  9. return 0;
  10. }

 输出


  
  1. 5
  2. 3

 但我还是不会,看看答案代码


  
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 100000 + 10;
  4. int tree[maxn << 2];
  5. int Left[maxn], pos[( 1 << 20) + 10];
  6. int a[maxn], n, m, x;
  7. //线段树模板
  8. void build(int o, int l, int r)
  9. {
  10. if(l == r)
  11. {
  12. tree[o] = Left[l];
  13. return;
  14. }
  15. int mid = (l + r) >> 1;
  16. build(o << 1, l, mid);
  17. build(o << 1 | 1, mid + 1, r);
  18. tree[o] = max(tree[o << 1], tree[o << 1 | 1]);
  19. }
  20. int query(int o, int l, int r, int L, int R)
  21. {
  22. if(L <= l && r <= R) return tree[o];
  23. int mid = (l + r) >> 1;
  24. int ans = 0;
  25. if(L <= mid)ans = max(ans, query(o << 1, l, mid, L, R));
  26. if(R > mid)ans = max(ans, query(o << 1 | 1, mid + 1, r, L, R));
  27. return ans;
  28. }
  29. int main()
  30. {
  31. scanf( "%d%d%d", &n, &m, &x);
  32. for( int i = 1; i <= n; i++) //预处理Left数组
  33. {
  34. scanf( "%d", &a[i]);
  35. Left[i] = pos[a[i] ^ x];
  36. pos[a[i]] = i;
  37. }
  38. build( 1, 1, n); //线段树建树
  39. while(m--)
  40. {
  41. int l, r;
  42. scanf( "%d%d", &l, &r);
  43. if( query( 1, 1, n, l, r) >= l) //查询区间最值
  44. printf( "yes\n");
  45. else
  46. printf( "no\n");
  47. }
  48. return 0;
  49. }

总结 

容易发现,2022年的题目普遍难于往年,尤其是A组,最难,比研究生组都难,,,

然后我统计了下2022Python,C++,Java的A,B,G组题目中,每个类型出现的次数:

考的最多的是:

模拟,数论,线段树,动态规划

里面比较简单而目前未掌握的有:

二分,差分,贪心,链表,博弈,枚举

多余的解释 - 许嵩 - 单曲 - 网易云音乐


转载:https://blog.csdn.net/csdner250/article/details/128502525
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场