当前位置:   article > 正文

【2022年第十三届蓝桥杯C/C++ C组国赛】 个人题解_蓝桥杯c组大学生c++国赛题目

蓝桥杯c组大学生c++国赛题目

目录

A 斐波那契与7

解题思路

参考代码

 B 小蓝做实验

解题思路

参考代码

C 取模

解题思路

参考代码

D 内存空间 

解题思路

参考代码

E 斐波那契数组

解题思路

参考代码

F 近似 GCD

解题思路

参考代码

G 数组个数

解题思路

参考代码

H 六六大顺

解题思路

参考代码

I 打折

解题思路 

参考代码

J 替换字符

解题思路

参考代码


斐波那契与7

解题思路

其一:暴力枚举(太慢了)

其二:找规律,打表发现有循环,数一下是60,每60个里有8个满足题目的数

参考代码

其一

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. ll n = 202202011200;
  5. ll a, b, c;
  6. ll ans;
  7. int main() {
  8. a = 1, b = 1;
  9. for (int i = 3; i <= n; i++) {
  10. c = (a + b) % 10;
  11. if (c == 7) ans++;
  12. a = b, b = c;
  13. }
  14. cout << ans;
  15. return 0;
  16. }

其二

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. ll n = 202202011200;
  5. ll ans;
  6. int main() {
  7. ans = n / 60 * 8;
  8. cout << ans;
  9. return 0;
  10. }

 B 小蓝做实验

解题思路

参考代码

C 取模

解题思路

参考代码

D 内存空间 

解题思路

参考代码

E 斐波那契数

解题思路

数据范围a小于1e6,打表发现最少31项就超过了1e6,也就是说只需要枚举前30项就行了,后面的必须改

参考代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. const int N = 1e5 + 5;
  5. ll inf = 0x3f3f3f3f;
  6. int n;
  7. ll a[N];
  8. int res = inf;
  9. int ans;
  10. int main() {
  11. cin >> n;
  12. for (int i = 1; i <= n; i++) cin >> a[i];
  13. if (n > 30) {
  14. ans += n - 30;
  15. n = 30;
  16. }
  17. ll x, y, z;
  18. for (int i = 1; i <= 1e6; i++) {
  19. x = y = i;
  20. int cnt = 0;
  21. if (a[1] != x) cnt++;
  22. if (a[2] != y) cnt++;
  23. for (int j = 3; j <= n; j++) {
  24. z = x + y;
  25. if (a[j] != z) cnt++;
  26. x = y, y = z;
  27. }
  28. res = min(res, cnt);
  29. }
  30. cout << ans + res;
  31. return 0;
  32. }

F 近似 GCD

解题思路

如果一个区间内都是g的倍数,那么随便改一个为g,近似GCD为g

如果有一个不为g的倍数,那么把这个数改成g,近似GCD为g

把a中不是g的倍数标记为1,否则为0,则问题转化为求区间和小于等于1的区间个数

其一:枚举左右端点+前缀和优化O(n^2) 40分

其二:枚举左端点,二分找右端点O(n logn)100分(别忘了开long long)

参考代码

其一

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N = 1e5 + 5;
  4. int n, g;
  5. int a[N], s[N];
  6. int ans;
  7. int main() {
  8. cin >> n >> g;
  9. for (int i = 1; i <= n; i++) {
  10. cin >> a[i];
  11. if (a[i] % g == 0) a[i] = 0;
  12. else a[i] = 1;
  13. s[i] = s[i - 1] + a[i];
  14. }
  15. for (int l = 1; l <= n; l++) {
  16. for (int r = l + 1; r <= n; r++) {
  17. if (s[r] - s[l - 1] <= 1) ans++;
  18. }
  19. }
  20. cout << ans;
  21. return 0;
  22. }

其二

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. const int N = 1e5 + 5;
  5. int n, g;
  6. int a[N], s[N];
  7. ll ans;
  8. int find(int l, int r) {
  9. int x = l;
  10. while (l < r) {
  11. int mid = (l + r + 1) >> 1;
  12. if (s[mid] - s[x - 1] <= 1) l = mid;
  13. else r = mid - 1;
  14. }
  15. return l;
  16. }
  17. int main() {
  18. cin >> n >> g;
  19. for (int i = 1; i <= n; i++) {
  20. cin >> a[i];
  21. if (a[i] % g == 0) a[i] = 0;
  22. else a[i] = 1;
  23. s[i] = s[i - 1] + a[i];
  24. }
  25. for (int l = 1; l <= n; l++) ans += find(l, n) - l;
  26. cout << ans;
  27. return 0;
  28. }

G 数组个数

解题思路

参考代码

H 六六大顺

解题思路

参考代码

I 打折

解题思路 

参考代码

J 替换字符

解题思路

使用线段树维护26个标记,然后暴力下传即可

参考代码
 

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define cl u << 1
  5. #define cr u << 1 | 1
  6. const int N = 1e5 + 5;
  7. string s;
  8. int n, m;
  9. int k = 26;
  10. struct node {
  11. int l, r;
  12. int v;
  13. int f[30];
  14. void init(int _l, int _r, char a) {
  15. l = _l, r = _r;
  16. v = a - 'a';
  17. for (int i = 0; i < k; i++) f[i] = i;
  18. }
  19. } t[N << 2];
  20. void build(int u, int l, int r) {
  21. if (l == r) t[u].init(l, r, s[l]);
  22. else {
  23. t[u].init(l, r, s[l]);
  24. int mid = (l + r) >> 1;
  25. build(cl, l, mid);
  26. build(cr, mid + 1, r);
  27. }
  28. }
  29. void pushdown(node &u, node &l, node &r) {
  30. for (int i = 0; i < k ; i++) l.f[i] = u.f[l.f[i]];
  31. for (int i = 0; i < k; i++) r.f[i] = u.f[r.f[i]];
  32. for (int i = 0; i < k; i++) u.f[i] = i;
  33. }
  34. void pushdown(int u) {
  35. pushdown(t[u], t[cl], t[cr]);
  36. }
  37. void modify(int u, int l, int r, int a, int b) {
  38. if (t[u].l >= l && t[u].r <= r) {
  39. for (int i = 0; i < k; i++) {
  40. if (t[u].f[i] == a) t[u].f[i] = b;
  41. }
  42. } else {
  43. pushdown(u);
  44. int mid = (t[u].l + t[u].r) >> 1;
  45. if (l <= mid) modify(cl, l, r, a, b);
  46. if (r > mid) modify(cr, l, r, a, b);
  47. }
  48. }
  49. void query(int u, int l, int r) {
  50. if (t[u].l == t[u].r) cout << char(t[u].f[t[u].v] + 'a');
  51. else {
  52. pushdown(u);
  53. int mid = (t[u].l + t[u].r) >> 1;
  54. if (l <= mid) query(cl, l, r);
  55. if (r > mid) query(cr, l, r);
  56. }
  57. }
  58. int main() {
  59. cin >> s >> m;
  60. n = s.size();
  61. s = ' ' + s;
  62. build(1, 1, n);
  63. int l, r;
  64. char a, b;
  65. while (m--) {
  66. cin >> l >> r >> a >> b;
  67. a -= 'a', b -= 'a';
  68. modify(1, l, r, a, b);
  69. }
  70. query(1, 1, n);
  71. return 0;
  72. }

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

闽ICP备14008679号