当前位置:   article > 正文

2024第十五届蓝桥杯省赛C++A组程序设计题解_蓝桥杯a组c++答案 2024

蓝桥杯a组c++答案 2024

 个人主页:

想转码的电筒人

专栏:

蓝桥杯

目录

试题C:训练士兵

试题D:团建

​编辑 ​编辑

 试题E:   成绩统计

试题F:因数计数

试题G:零食采购


ps:没有答案,考场上的代码,不一定对,大佬们轻喷,可以提供点更好的思路~

试题C:训练士兵

9ea249fe760341b7986d75dc43a90f1a.png

2c45d7cf7aac4bcf9fdb18cb4f282fca.png

解题思路

对于每次训练,需要考虑采用士兵单独训练还是组团训练的方式,故每次训练将所需训练次数大于0的士兵花费进行求和,与组团训练进行比较,以此判断是否要采用组团训练的方式

代码

  1. #include<bits/stdc++.h>
  2. #include<unordered_map>
  3. #include<unordered_set>
  4. #define ll long long
  5. using namespace std;
  6. int N, S;
  7. int main() {
  8. cin >> N >> S;
  9. int n = N;
  10. vector<int> p; //成本
  11. vector<int> c; //次数
  12. while (n--) {
  13. int pi, ci;
  14. cin >> pi >> ci;
  15. p.push_back(pi);
  16. c.push_back(ci);
  17. }
  18. int sum = 0;
  19. while (1) {
  20. int flag = 1;
  21. int consume = 0;
  22. for (int i = 0; i < c.size(); i++) {
  23. if (c[i] > 0)
  24. {
  25. consume += p[i];
  26. c[i]--;
  27. flag = 0;
  28. }
  29. }
  30. sum += min(consume, S);
  31. if (flag) break;
  32. }
  33. cout << sum;
  34. return 0;
  35. }

试题D:团建

c00ca8135f57425091426e5fd5895438.png 9c8dc68914f44edd99da188cf1a9b981.png

解题思路

对于该题,考虑层序遍历,先将树的孩子用vector容器进行存储,因题目说明每棵树不会有节点的值重复,故进行层序遍历,判断树的每层是否有相同结点值,以此判断最长公共前缀

代码

  1. #include<bits/stdc++.h>
  2. #include<unordered_map>
  3. #include<unordered_set>
  4. #define ll long long
  5. using namespace std;
  6. const int T = 200000;
  7. vector<vector<int>> tree1(T);
  8. vector<vector<int>> tree2(T);
  9. vector<int> nums1(T);
  10. vector<int> nums2(T);
  11. int N, M;
  12. int get() {
  13. int sum = 0;
  14. int t1 = 1, t2 = 1;
  15. if (nums1[1] == nums2[1]) sum++;
  16. else return 0;
  17. while (1) {
  18. int i, j;
  19. int flag = 1;
  20. if (tree1[t1].size() == 0 || tree2[t2].size() == 0) break;
  21. for (i = 0; i < tree1[t1].size(); i++) {
  22. for (j = 0; j < tree2[t2].size(); j++) {
  23. if (nums1[tree1[t1][i]] == nums2[tree2[t2][j]]) //寻找公共前缀
  24. {
  25. flag = 0;
  26. t1 = tree1[t1][i];
  27. t2 = tree2[t2][j]; //选取下一层的父节点
  28. sum++;
  29. break;
  30. }
  31. }
  32. }
  33. if (flag) break;
  34. }
  35. return sum;
  36. }
  37. int main() {
  38. cin >> N >> M;
  39. int n = N, m = M;
  40. int temp;
  41. while (n--) {
  42. cin >> temp;
  43. nums1[N - n] = temp;
  44. }
  45. while (m--) {
  46. cin >> temp;
  47. nums2[M - m] = temp;
  48. }
  49. n = N - 1; m = M - 1;
  50. int t1, t2;
  51. while (n--) {
  52. cin >> t1 >> t2;
  53. tree1[min(t1, t2)].push_back(max(t1, t2));
  54. }
  55. while (m--) {
  56. cin >> t1 >> t2;
  57. tree2[min(t1, t2)].push_back(max(t1, t2)); //存储每个节点的孩子
  58. }
  59. cout << get();
  60. return 0;
  61. }

 试题E:   成绩统计

284b961ff41046bc9a955037c1f4d0e1.png

解题思路

对于该题,考虑动态规划解法,先取前k个人的成绩计算其方差,并将成绩记录在数组中,记录当前均值,设小蓝已检查前i-1个人的成绩,若方差依然大于T,找出离均值最远的一个成绩,若第i个人的成绩距离当前均值更近,则剔除离均值较远的成绩,使得方差变小,若遍历完整个数组均找不到更小的方差,返回-1

代码

  1. #include<bits/stdc++.h>
  2. #include<unordered_map>
  3. #include<unordered_set>
  4. #define ll long long
  5. using namespace std;
  6. vector<double> t;
  7. vector<double> nums;
  8. int N, k, T;
  9. bool calculate0() { //判断方差是否小于指定值
  10. double e;
  11. double sum = 0;
  12. for (auto num : t) {
  13. sum += num;
  14. }
  15. e = sum / k;
  16. double val = 0;
  17. for (auto num : t) {
  18. val += (num - e) * (num - e);
  19. }
  20. val /= k;
  21. if (val < T) return true;
  22. else return false;
  23. }
  24. int main() {
  25. cin >> N >> k >> T;
  26. int n = N;
  27. while (n--) {
  28. double temp;
  29. cin >> temp;
  30. nums.push_back(temp);
  31. }
  32. if (N < k) { cout << -1; return 0; }
  33. double mean = 0;
  34. for (int i = 0; i < k; i++) {
  35. t.push_back(nums[i]);
  36. mean += nums[i];
  37. }
  38. mean /= k;
  39. if (calculate0()) { cout << k; return 0; }
  40. for (int length = k; length < nums.size(); length++) {
  41. double sub = 0;
  42. int x = -1;
  43. for (int i = 0; i < t.size(); i++) {
  44. if (abs(t[i] - mean) > sub) {
  45. sub = abs(t[i] - mean);
  46. x = i;
  47. }
  48. }
  49. if (x != -1 && sub > abs(nums[length] - mean)) //判断是否更接近均值
  50. t[x] = nums[length];
  51. if (calculate0()) { cout << length + 1; return 0; }
  52. }
  53. cout << -1;
  54. return 0;
  55. }

试题F:因数计数

24b2e93b5c6f4aad839b7b6e50448e93.png

解题思路

循环遍历数组,判断因数找出所有的有序二元组对,并用集合进行存储,遍历集合,以i,j,k,l互不相等为条件,生成有序四元组,计算四元组个数

代码

  1. #include<bits/stdc++.h>
  2. #include<unordered_map>
  3. #include<unordered_set>
  4. #define ll long long
  5. using namespace std;
  6. set<pair<int, int>> s;
  7. int main() {
  8. int N;
  9. cin >> N;
  10. vector<int> nums;
  11. while (N--) {
  12. int temp;
  13. cin >> temp;
  14. nums.push_back(temp);
  15. }
  16. for (int i = 0; i < nums.size(); i++) {
  17. for (int j = i + 1; j < nums.size(); j++) {
  18. if (nums[i] % nums[j] == 0)
  19. s.insert({ j + 1,i + 1 });
  20. if(nums[j] % nums[i] == 0)
  21. s.insert({ i + 1,j + 1 }); //判断ai和aj是否为对方的因数
  22. }
  23. }
  24. int sum = 0;
  25. for (auto t1 : s) {
  26. for (auto t2 : s) {
  27. if (t1.first != t2.first && t1.first != t2.second && t1.second != t2.first && t1.second != t2.second)
  28. sum++;
  29. }
  30. }
  31. cout << sum;
  32. return 0;
  33. }

试题G:零食采购

56f0c99b98044f7f90a9d01aadb5bee8.png

99c1cd5c9a0b42c9aa203f0778d00399.png

解题思路

该题是一道图论问题,目的是寻找最短路径下能采购到的零食总数,故先利用矩阵生成无向连通图,再采用深度优先遍历,存储两点之间的所有路径,再判断哪条最短路径,在最短路径下模拟零食采购,用集合存储零食种类,集合大小即为所求零食种类数

代码

  1. #include<bits/stdc++.h>
  2. #include<unordered_map>
  3. #include<unordered_set>
  4. #define ll long long
  5. using namespace std;
  6. int N, q;
  7. vector<int> type;
  8. vector<int> temp;
  9. void dfs(int b, int e,vector<vector<int>>& line,vector<vector<int>> matrix,int length) {
  10. if (b == e) { line.push_back(temp); return; }
  11. if (length > N) return;
  12. for (int i = 0; i < matrix[b].size();i++) {
  13. if (matrix[b][i] == 1) {
  14. temp.push_back(i); //将当前节点加入路径中
  15. dfs(i, e, line, matrix,length+1);
  16. temp.pop_back();
  17. }
  18. }
  19. return;
  20. }
  21. int main() {
  22. cin >> N >> q;
  23. vector<int> t(N, 0);
  24. vector<vector<int>> matrix(N, t);
  25. int n = N;
  26. while (n--) {
  27. int temp;
  28. cin >> temp;
  29. type.push_back(temp);
  30. }
  31. n = N - 1;
  32. while (n--) {
  33. int i, j;
  34. cin >> i >> j;
  35. matrix[i - 1][j - 1] = 1;
  36. matrix[j - 1][i - 1] = 1; //生成无向连通图
  37. }
  38. while (q--) {
  39. int begin0, end0;
  40. cin >> begin0 >> end0;
  41. vector<vector<int>> line;
  42. dfs(begin0 - 1, end0 - 1, line,matrix,0);
  43. int minlength = line[0].size();
  44. int f = 0;
  45. for (int i = 0; i < line.size(); i++)
  46. {
  47. if (line[i].size() < minlength) {
  48. f = i;
  49. minlength = line[i].size(); //寻找最短路径
  50. }
  51. }
  52. set<int> s;
  53. s.insert(type[begin0 - 1]);
  54. for (auto x : line[f]) {
  55. s.insert(type[x]); //模拟零食采购
  56. }
  57. cout << s.size();
  58. }
  59. return 0;
  60. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号