当前位置:   article > 正文

2024第十五届蓝桥杯 C/C++ B组 参赛经历分享(以及部分题解)_第十五届蓝桥杯软件赛省赛c/c++b 组题解

第十五届蓝桥杯软件赛省赛c/c++b 组题解

前言

emmmmmm,dp杯居然不考dp了,蓝桥一直没怎么出过的高精度居然也考了(当时居然因为没太复习那块知识直接模拟混分了),题量也改了,总的来说反而简单了?。。。还好天津竞赛弱省,但愿能够省一吧。。。(图灵保佑)

好那么进入正题


第一题

好那么好,小水题一道(50 * 49 / 2)- (7 * 6 / 2)=1204,cout 出去,过啦!!(此处配有英雄哥圣音)


第二题

好,过过过过过过(卡壳),过不了一点啊啊啊啊啊啊啊,很数学的一道题,原谅我这烂数学,此处只能引用某乎大佬的推理过程

大佬的思路真是清清又晰晰啊。。。。我的烂代码写的判断四个方向,转来转去转来转去,也没能得出答案


第三题 

好那么好,蓝桥总是能在我快要崩溃的时候让我找回自信,很简单的一个模拟题,1e7的数据压根爆不了一点,吐槽一嘴:蓝桥正赛居然能遇见这么好写的题目了吗。。。

  1. #include<iostream>
  2. using namespace std;
  3. bool is_good(int n){
  4. int flag = 1;
  5. while(n){
  6. if((n%10)%2 != flag++ %2){
  7. return false;
  8. }
  9. n /= 10;
  10. }
  11. return true;
  12. }
  13. int n,res;
  14. int main()
  15. {
  16. cin >> n;
  17. for(int i=1;i<=n;i++){
  18. if(is_good(i))
  19. res++;
  20. }
  21. cout << res;
  22. return 0;
  23. }

第四题 

嘿,不看数据量还真以为蓝桥要沦落为水赛了嘿,这刚一看不来个小白都会写吗,转头就是个暴击

高精度还忘了,但愿前50%错不了


第五题 

 很好的数论,使我的大脑旋转,爱来自蓝桥。很想知道大佬们怎么一眼就看出这个式子等于gcd(a,b,c)的,我赛场上直接暴力了,不过就这个数据量来看,数据量再大一点就会爆炸,(再近一点靠近点快被融化)(bushi)愿kunkun保佑我骗分


第六题 

好,我真是太喜欢这种不在题目里玩一点心眼子,直接告诉你该干嘛的搜索题目了,数据量N小于等于10,那么我们直接上dfs ,走起

  1. #include <iostream>
  2. #include<set>
  3. #include<vector>
  4. using namespace std;
  5. int f[8][2] = {
  6. {-1, 0} ,
  7. {-1, 1} ,
  8. {0 , 1} ,
  9. {1 , 1} ,
  10. {1 , 0} ,
  11. {1 ,-1} ,
  12. {0 ,-1} ,
  13. {-1,-1}
  14. };
  15. vector<int> ans;
  16. set<pair<int, int>> se;
  17. int a[12][12], flag = 1;
  18. bool vis[12][12];
  19. int n, k;
  20. void dfs(int x, int y) {
  21. if (flag == 0) {
  22. return;
  23. }
  24. if (x == n && y == n && ans.size() == n * n - 1) {
  25. flag = 0;
  26. for (int i = 0; i < ans.size(); i++) {
  27. cout << ans[i];
  28. }
  29. return;
  30. }
  31. if (x == 0 || y == 0 || x > n || y > n) {
  32. return;
  33. }
  34. for (int i = 0; i < 8; i++)
  35. {
  36. int gox = x + f[i][0];
  37. int goy = y + f[i][1];
  38. int t = (x - 1) * n + y, to = (gox - 1) * n + goy;
  39. pair<int, int> road({ t,to });
  40. if (vis[gox][goy] == false && (a[x][y] + 1) % k == a[gox][goy] && se.find(road) == se.end()) {
  41. vis[gox][goy] = true;
  42. ans.push_back(i);
  43. if (i == 1) {
  44. se.insert({ t + 1,t - n });
  45. se.insert({ t - n,t + 1 });
  46. }
  47. else if (i == 3) {
  48. se.insert({ t + 1,t + n });
  49. se.insert({ t + n,t + 1 });
  50. }
  51. else if (i == 5) {
  52. se.insert({ t - 1 ,t + n });
  53. se.insert({ t + n,t - 1 });
  54. }
  55. else if (i == 7) {
  56. se.insert({ t - 1,t - n });
  57. se.insert({ t - n,t - 1 });
  58. }
  59. dfs(gox, goy);
  60. if (i == 1) {
  61. se.erase({ t + 1,t - n });
  62. se.erase({ t - n,t + 1 });
  63. }
  64. else if (i == 3) {
  65. se.erase({ t + 1,t + n });
  66. se.erase({ t + n,t + 1 });
  67. }
  68. else if (i == 5) {
  69. se.erase({ t - 1 ,t + n });
  70. se.erase({ t + n,t - 1 });
  71. }
  72. else if (i == 7) {
  73. se.erase({ t - 1,t - n });
  74. se.erase({ t - n,t - 1 });
  75. }
  76. vis[gox][goy] = false;
  77. ans.pop_back();
  78. }
  79. }
  80. return;
  81. }
  82. int main()
  83. {
  84. cin >> n >> k;
  85. vis[1][1] = true;
  86. for (int i = 1; i <= n; i++) {
  87. for (int j = 1; j <= n; j++) {
  88. cin >> a[i][j];
  89. }
  90. }
  91. dfs(1, 1);
  92. if (flag) {
  93. cout << -1;
  94. }
  95. return 0;
  96. }

我的acmer学长告诉我这样写常数太大了,容易炸,但愿还能混过前80%。。但是dotcpp上的民间数据倒是确确实实ac过去了,又是听天由命的一集,提一嘴,路径不让交叉的存储方法我看有大佬写的四维数组来标记,也就是记录起点(x0,y0)以及终点(x1,y1) 我更倾向于用(x-1) * n + y把他们弄成编号 ,虽然当时没想到数组去记录就好(会比set的插入删除操作更快,可能当时脑抽了吧,临场的时候就是想到啥直接用了,没有啥时间去做更多的考虑)


第七题 

对于任意一个大于等于2的数来说,开根号并向下取整肯定是优于(或等于)减半的,所以我们利用优先队列(堆)每次对最大数进行开根号操作(P次以后变成减半操作),然后弹出并把操作后得到的新数放回去就行了,也就是堆+贪心,但有大佬把出题人hack了

恕我太菜没想到这种数据的解决办法,而且赛场上这个题我压根就没写。。。(调暴搜花了1.5h给自己整累了,觉得反正后面更难懒得写了)

附代码(非本人手写)

  1. #include<iostream>
  2. #include<queue>
  3. #include<algorithm>
  4. #include<cmath>
  5. using namespace std;
  6. typedef long long ll;
  7. int n,P,Q;
  8. int a[100010];
  9. int main()
  10. {
  11. priority_queue<int> heap;
  12. scanf("%d%d%d",&n,&P,&Q);
  13. for(int i=1;i<=n;i++) scanf("%d",&a[i]),heap.push(a[i]);
  14. while(P||Q)
  15. {
  16. auto x=heap.top();
  17. heap.pop();
  18. if(P&&Q)
  19. {
  20. int yl=sqrt(x);
  21. int y2=x/2;
  22. if(y2<=yl)
  23. {
  24. Q--;
  25. heap.push(y2);
  26. }
  27. else
  28. {
  29. P--;
  30. heap.push(yl);
  31. }
  32. }
  33. else if(P)
  34. {
  35. int yl=sqrt(x);
  36. P--;
  37. heap.push(yl);
  38. }
  39. else
  40. {
  41. int y2=x/2;
  42. Q--;
  43. heap.push(y2);
  44. }
  45. }
  46. ll res=0;
  47. while(!heap.empty())
  48. {
  49. int x=heap.top();
  50. heap.pop();
  51. res+=x;
  52. }
  53. printf("%lld\n",res);
  54. return 0;
  55. }

第八题 

没什么好解释的,纯粹的不会,当时感觉这个题前缀和应该是有用的,但是就是一点都不想写了,就是累了摆了菜了qwq呜呜呜呜。。。。


吐槽

感觉总体上比去年是更简单了,去年最后那俩lca我当时大一是真一点都看不懂,emmmm,今年好像真的没有dp,难道dp杯知道自己黑称要改过自新?

求求今年让孩子混个省一吧(哭哭哭哭qaq qaq)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/478621
推荐阅读
相关标签
  

闽ICP备14008679号