当前位置:   article > 正文

2019 【第十届蓝桥杯省赛】 C/C++ C组_蓝桥杯to_string(n)

蓝桥杯to_string(n)

目录

试题A:求和

试题B:矩形切割

试题C:年号字串

试题D:质数

试题E:最大降雨量

试题F:旋转

试题G:外卖店优先级

试题H:人物相关性分析(没有AC)

试题 I:等差数列

试题J:扫地机器人(不会)


试题A:求和

本题总分:5分

【问题描述】

      小明对数位中含有 2、0、1、9 的数字很感兴趣,在 1 到 40 中这样的数包 括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。

      请问,在 1 到 2019 中,所有这样的数的和是多少?

① to_string()函数

其他类型数据转string,C++11新特性,很方便,比赛的时候大题不要用(蓝桥不能使用C++11特性)

填空要用的话看以这个回答:Dev 使用C++11特性

大题的话,int转string可以用sprintf(),stringstream代替:C/C++ int 和 string 相互转换

② find_first_of(string str,int index = 0)函数:

查找在字符串中第一个与str中的某个字符匹配的字符,返回它的位置。搜索从index开始,如果没找到就返回string::npos

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5. int m = 2019, sum = 0;
  6. string s;
  7. m++;
  8. while (m-- > 1)
  9. {
  10. s = to_string(m);
  11. if (s.find_first_of("2019") != string::npos)
  12. {
  13. sum += m;
  14. }
  15. }
  16. cout << sum << endl;
  17. //system("pause");
  18. return 0;
  19. }
  20. /*
  21. 答案:1905111
  22. */

试题B:矩形切割

本题总分:5 分
【问题描述】
小明有一些矩形的材料,他要从这些矩形材料中切割出一些正方形。
当他面对一块矩形材料时,他总是从中间切割一刀,切出一块最大的正方 形,剩下一块矩形,然后再切割剩下的矩形材料,直到全部切为正方形为止。

例如,对于一块两边分别为 5 和 3 的材料(记为 5×3),小明会依次切出 3×3、2×2、1×1、1×1 共 4 个正方形。

现在小明有一块矩形的材料,两边长分别是 2019 和 324。请问小明最终会 切出多少个正方形?

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int work(int a, int b)
  4. {
  5. if (a == b)
  6. return 1;
  7. int k = min(a, b);
  8. int l = max(a, b);
  9. return work(k, l - k) + 1;
  10. }
  11. int main()
  12. {
  13. int a = 2019, b = 324;
  14. cout << work(a, b) << endl;
  15. //system("pause");
  16. return 0;
  17. }
  18. /*
  19. 答案:21
  20. */

试题C:年号字串

本题总分:5 分

【问题描述】

小明用字母 A 对应数字 1,B 对应 2,以此类推,用 Z 对应 26。对于 27 以上的数字,小明用两位或更长位的字符串来对应,例如 AA 对应 27,AB 对 应 28,AZ 对应 52,LQ 对应 329。

请问 2019 对应的字符串是什么?

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5. int m = 2019;
  6. while( m!=0)
  7. {
  8. int t = m%26;
  9. m=m/26;
  10. cout << char(t+64);
  11. }
  12. //system("pause");
  13. return 0;
  14. }
  15. /*
  16. 输出:QYB
  17. 答案:BYQ
  18. */

试题D:质数

本题总分:10 分

【问题描述】

我们知道第一个质数是 2、第二个质数是 3、第三个质数是 5……请你计算 第 2019 个质数是多少?

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int prim(int a)
  4. {
  5. for (int i = 2; i <= sqrt(a); i++)
  6. {
  7. if (a % i == 0)
  8. return false;
  9. }
  10. return true;
  11. }
  12. int main()
  13. {
  14. int cnt = 0;
  15. for (int i = 1; i; i++)
  16. {
  17. if (prim(i) == true)
  18. cnt++;
  19. if (cnt == 2020)
  20. {
  21. cout << i << endl;
  22. break;
  23. }
  24. }
  25. //system("pause");
  26. return 0;
  27. }
  28. /*
  29. 答案:17569
  30. */

试题E:最大降雨量

本题总分:10 分

【问题描述】
由于沙之国长年干旱,法师小明准备施展自己的一个神秘法术来求雨。
这个法术需要用到他手中的 49 张法术符,上面分别写着 1 至 49 这 49 个数字。法术一共持续 7 周,每天小明都要使用一张法术符,法术符不能重复使用。
每周,小明施展法术产生的能量为这周 7 张法术符上数字的中位数。法术施展完 7 周后,求雨将获得成功,降雨量为 7 周能量的中位数。
由于干旱太久,小明希望这次求雨的降雨量尽可能大,请大最大值是多少?

上图借鉴于博客:https://blog.csdn.net/u013377068/article/details/88776898 博主:糖宋元明清 

例如这样,就是一种可能的答案: 

答案:34

试题F:旋转

时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分

【问题描述】

图片旋转是对图片最简单的处理方式之一,在本题中,你需要对图片顺时针旋转 90 度。
我们用一个 n × m 的二维数组来表示一个图片,例如下面给出一个 3 × 4 的图片的例子:
1 3 5 7
9 8 7 6
3 5 9 7
这个图片顺时针旋转 90 度后的图片如下:
3 9 1
5 8 3
9 7 5
7 6 7
给定初始图片,请计算旋转后的图片。

【输入格式】
输入的第一行包含两个整数 n 和 m,分别表示行数和列数。
接下来 n 行,每行 m 个整数,表示给定的图片。图片中的每个元素(像素)为一个值为 0 至 255 之间的整数(包含 0 和 255)。

【输出格式】
输出 m 行 n 列,表示旋转后的图片。

【样例输入】

  1. 3 4
  2. 1 3 5 7
  3. 9 8 7 6
  4. 3 5 9 7

【样例输出】

  1. 3 9 1
  2. 5 8 3
  3. 9 7 5
  4. 7 6 7

【评测用例规模与约定】
对于 30% 的评测用例,1 ≤ n, m ≤ 10。
对于 60% 的评测用例,1 ≤ n, m ≤ 30。
对于所有评测用例,1 ≤ n, m ≤ 100。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5. int n, m;
  6. cin >> n >> m;
  7. int map[200][200];
  8. for (int i = 0; i < n; i++)
  9. for (int j = 0, t; j < m; j++)
  10. cin >> map[i][j];
  11. for (int i = 0; i < m; i++)
  12. for (int j = n - 1; j >= 0; j--)
  13. cout << map[j][i] << (j==0?'\n':' ');
  14. //system("pause");
  15. return 0;
  16. }

试题G:外卖店优先级

【题目描述】

“饱了么”外卖系统中维护着 N 家外卖店,编号 1 ∼ N。每家外卖店都有 一个优先级,初始时 (0 时刻) 优先级都为 0。

每经过 1 个时间单位,如果外卖店没有订单,则优先级会减少 1,最低减 到 0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加 2。

如果某家外卖店某时刻优先级大于 5,则会被系统加入优先缓存中;如果 优先级小于等于 3,则会被清除出优先缓存。

给定 T 时刻以内的 M 条订单信息,请你计算 T 时刻时有多少外卖店在优 先缓存中。

【输入】

第一行包含 3 个整数 N、M 和 T。
以下 M 行每行包含两个整数 ts 和 id,表示 ts 时刻编号 id 的外卖店收到

一个订单。

【输出】

输出一个整数代表答案。

【样例输入】

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

【样例输出】

1

【样例解释】

6 时刻时,1 号店优先级降到 3,被移除出优先缓存;2 号店优先级升到 6, 加入优先缓存。所以是有 1 家店 (2 号) 在优先缓存中。

【评测用例规模与约定】

对于 80% 的评测用例,1 ≤ N, M, T ≤ 10000。 对于所有评测用例,1 ≤ N, M, T ≤ 100000,1 ≤ ts ≤ T,1 ≤ id ≤ N。

 对每个店进行分析。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5. int n, m, t, ts, id, cnt = 0;
  6. int level;
  7. bool is_priority = false;
  8. vector<int> v[100005];
  9. cin >> n >> m >> t;
  10. for (int i = 1; i <= m; i++)
  11. {
  12. cin >> ts >> id;
  13. v[id].push_back(ts);
  14. }
  15. for (int i = 1; i <= n; i++)
  16. {
  17. if (v[i].size() == 0)
  18. continue;
  19. sort(v[i].begin(), v[i].end());
  20. is_priority = false;
  21. level = 2;
  22. for (int j = 1; j < v[i].size(); j++)
  23. {
  24. if (v[i][j] - v[i][j - 1] <= 1)
  25. level += 2;
  26. else
  27. {
  28. level -= (v[i][j] - v[i][j - 1] - 1);
  29. if (level < 0)
  30. level = 0;
  31. if (level <= 3)
  32. is_priority = false;
  33. level += 2;
  34. }
  35. if (level > 5)
  36. {
  37. is_priority = true;
  38. }
  39. }
  40. int k = v[i][v[i].size() - 1];
  41. level -= (t - k);
  42. if (level <= 3)
  43. is_priority = false;
  44. if (is_priority == true)
  45. cnt++;
  46. }
  47. cout << cnt << endl;
  48. //system("pause");
  49. return 0;
  50. }
  51. /*
  52. 1 4 7
  53. 1 1
  54. 2 1
  55. 3 1
  56. 7 1
  57. */

试题H:人物相关性分析(没有AC)

时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分

【问题描述】
       小明正在分析一本小说中的人物相关性。他想知道在小说中 Alice 和 Bob 有多少次同时出现。 更准确的说,小明定义 Alice 和 Bob“同时出现”的意思是:在小说文本 中 Alice 和 Bob 之间不超过 K 个字符。
例如以下文本:
       This is a story about Alice and Bob.Alice wants to send aprivate message to Bob. 假设 K = 20,则 Alice 和 Bob 同时出现了 2 次,分别是”Alice and Bob” 和”Bob. Alice”。前者 Alice 和 Bob 之间有 5 个字符,后者有 2 个字符。 注意: 1. Alice 和 Bob 是大小写敏感的,alice 或 bob 等并不计算在内。 2. Alice 和 Bob 应为单独的单词,前后可以有标点符号和空格,但是不能 有字母。例如 Bobbi 並不算出现了 Bob。
【输入格式】
       第一行包含一个整数 K。 第二行包含一行字符串,只包含大小写字母、标点符号和空格。长度不超 过 1000000。
【输出格式】
       输出一个整数,表示 Alice 和 Bob 同时出现的次数。
【样例输入】

  1. 20
  2. This is a story about Alice and Bob.Alice wants to send aprivate message to Bob.

【样例输出】

2

【评测用例规模与约定】
       对于所有评测用例,1K1000000

https://www.dotcpp.com/oj/problem2309.html,C语言网上1/243的正确率。。。。

目前全网没找到分享正确答案的博主,我自己也没AC,oj跑36分,,一百万长的串!!怎样才能不超时呀。。。求指点(*╹▽╹*)

  1. #include <iostream>
  2. #include <map>
  3. #include <string>
  4. using namespace std;
  5. int main()
  6. {
  7. ios::sync_with_stdio(false);
  8. cin.tie(0);cout.tie(0);
  9. int m, cnt = 0;
  10. string str;
  11. pair<int, int> p[500005];
  12. int pter = 0;
  13. cin >> m;
  14. cin.get();
  15. getline(cin, str);
  16. int pos1 = 0;
  17. while (pos1 != string::npos)
  18. {
  19. pos1 = str.find("Alice", pos1);
  20. if (string::npos != pos1 && (!isalnum(str[pos1 - 1]) && !isalnum(str[pos1 + 5])))
  21. {
  22. p[pter].first = pos1;
  23. p[pter++].second = 1;
  24. pos1 += 5;
  25. }
  26. }
  27. int pos2 = 0;
  28. while (pos2 != string::npos)
  29. {
  30. pos2 = str.find("Bob", pos2);
  31. if (string::npos != pos2 && (!isalnum(str[pos2 - 1]) && !isalnum(str[pos2 + 3])))
  32. {
  33. p[pter].first = pos2;
  34. p[pter++].second = 2;
  35. pos2 += 3;
  36. }
  37. }
  38. for (int it = 0; it < pter; it++)
  39. {
  40. int f = p[it].second;
  41. int t = f == 1 ? 3 : 5;
  42. for (int i = it; i != pter; i++)
  43. {
  44. if(p[i].first-p[it].first > m)
  45. break;
  46. if(p[i].second != f)
  47. cnt++;
  48. }
  49. }
  50. cout << cnt << endl;
  51. //system("pause");
  52. return 0;
  53. }
  54. /*
  55. 20
  56. This is a story about Alice and Bob. Alice wants to send a private message to Bob.
  57. 20
  58. 20
  59. Alice Alice Bob story about Alice and Bob. Alice wants to send a private message to Bob.
  60. 20
  61. Alice Bob Alice Bob Alice Bob
  62. 20
  63. Alice Bob Bob Bob Alice Bob Alice Bob
  64. 20
  65. Bob Alice Alice Alice
  66. */

试题 I:等差数列

时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分

【题目描述】

数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一 部分的数列,只记得其中 N 个整数。

现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有 几项?

【输入】

输入的第一行包含一个整数 N。 第二行包含N个整数A1,A2,···,AN。(注意A1 ∼AN并不一定是按等差数

列中的顺序给出)

【输出】

输出一个整数表示答案

【样例输入】

  1. 5
  2. 2 6 4 10 20

【样例输出】

10

【样例说明】

包含 2、6、4、10、20 的最短的等差数列是 2、4、6、8、10、12、14、16、 18、20。

【评测用例规模与约定】

对于所有评测用例,2 ≤ N ≤ 100000,0 ≤ Ai ≤ 10^9

从小到大排好序,公差d = min(d[i]-d[i-1]),先求出d

然后有三种情况:

一、2 4 6 10 20  ,显然d = 2, 项数 =(20-2)/2+1 = 10;

二、1 3 8,算出来d=2,但这是错的,(8-1)/ 2= 3.5 ,两项之差不能被d整除,不符合等差数列性质,所以d=1;

三、2 2 2 2 2,d=0,直接输出n。

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <stack>
  5. #include <cmath>
  6. #include <iomanip>
  7. #include <vector>
  8. using namespace std;
  9. int main()
  10. {
  11. ios::sync_with_stdio(false);
  12. cin.tie(0);
  13. cout.tie(0);
  14. int m;
  15. vector<int> v;
  16. cin >> m;
  17. for (int i = 0, t; i < m; i++)
  18. {
  19. cin >> t;
  20. v.push_back(t);
  21. }
  22. sort(v.begin(), v.end());
  23. int d = INT32_MAX;
  24. for (int i = 1; i < v.size(); i++)
  25. {
  26. int t = fabs(v[i] - v[i - 1]);
  27. d = min(d, t);
  28. }
  29. int k = v[m - 1] - v[0];
  30. cout << (k == 0 ? m : (k % d == 0 ? k / d + 1 : k + 1)) << endl;
  31. //system("pause");
  32. return 0;
  33. }

试题J:扫地机器人(不会)

完全没有思路

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/article/detail/48851
推荐阅读
相关标签
  

闽ICP备14008679号