【蓝桥杯冲刺】蓝桥杯13届省赛C++b组真题-A~E题

简介: 【蓝桥杯冲刺】蓝桥杯13届省赛C++b组真题-A~E题

试题A:九进制转十进制

九进制正整数 (2022)  转换成十进制等于多少?


解题思路

直接转就完了。


#include 
#include 
using namespace std;
int main() {
  cout << 2 * pow(9, 0) + 2 * pow(9, 1) + 0 * pow(9, 2) + 2 * pow(9, 3) << endl;
  return 0;
}

答案

1478

试题B:顺子日期

小明特别喜欢顺子。


顺子指的就是连续的三个数:123 、456 等。


顺子日期指的就是在日期的 yyyymmdd 表示法中,存在任意连续的三位数是一个顺子的日期。


例如 20220123 就是一个顺子日期,因为它出现了一个顺子:123 ;


而 20221023 则不是一个顺子日期,它一个顺子也没有。


小明想知道在整个 2022 年份中,一共有多少个顺子日期。


解题思路

这道题有一定争议,


如果你认为 012 算顺子,那么:


#include 
#include 
using namespace std;
int month[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int res = 0;
void check(int x) {
  string s = to_string(x);
  for (int i = 0; i + 2 < s.size(); i++) {
  if (s[i] + 1 == s[i + 1] && s[i] + 2 == s[i + 2]) {
    res++;
    return;
  }
  }
}
int main() {
  int year = 2022;
  for (int i = 0; i <= 365; i++) {
  int day = i, mon = 1;
  //算出月份和日期
  while (day > month[mon]) {
    mon++;
    day -= month[mon];
  }
  int y = year * 10000 + mon * 100 + day;
  check(y);//查看是不是顺子
  }
  cout << res << endl;
  return 0;
}

如果你认为 012 不算顺子:


#include 
#include 
using namespace std;
int month[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int res = 0;
void check(int x) {
  string s = to_string(x);
  for (int i = 0; i + 2 < s.size(); i++) {
  //加一个判断即可
  if (s[i] != '0' && s[i] + 1 == s[i + 1] && s[i] + 2 == s[i + 2]) {
    res++;
    return;
  }
  }
}
int main() {
  int year = 2022;
  for (int i = 0; i <= 365; i++) {
  int day = i, mon = 1;
  //算出月份和日期
  while (day > month[mon]) {
    mon++;
    day -= month[mon];
  }
  int y = year * 10000 + mon * 100 + day;
  check(y);//查看是不是顺子
  }
  cout << res << endl;
  return 0;
}


答案

如果你认为 012 算顺子:


14

如果你认为 012 不算顺子:


4

两个答案都是对的。


试题C:刷题统计

【问题描述】


小明决定从下周一开始努力刷题准备蓝桥杯竞赛。


他计划周一至周五每天做 a 道题目,周六和周日每天做 b 道题目。


请你帮小明计算,按照计划他将在 第几天实现做题数大于等于 n 题?


【输入格式】


输入一行包含三个整数 a , b 和 n 。


【输出格式】


输出一个整数代表天数。


【样例输入】


10 20 99

【样例输出】


8

【评测用例规模与约定】


对于 50 % 的评测用例, 1 ≤ a , b , n ≤  .


对于 100 % 的评测用例, 1 ≤ a , b , n ≤  .


题解思路

简单模拟即可。


代码

#include 
using namespace std;
int day[] = { 0, 1, 2, 3, 4, 5, 6 };
int main() {
  int a, b, n;
    scanf("%d %d %d", &a, &b, &n);  
  int i = 0, cnt = 0;
  while (n > 0) {
  i %= 7;
  if (day[i] >= 0 && day[i] <= 4) {
    n -= a;
  }
  else {
    n -= b;
  }
  i++;
  cnt++;
  }
  printf("%d", cnt);
  return 0;
}


试题D:修建灌木

【问题描述】


爱丽丝要完成一项修剪灌木的工作。


有 N 棵灌木整齐的从左到右排成一排。


爱丽丝在每天傍晚会修剪一棵灌木,让灌木的高度变为 0 厘米。


爱丽丝修剪灌木的顺序是从最左侧的灌木开始, 每天向右修剪一棵灌木。


当修剪了最右侧的灌木后,她会调转方向,下一天开始向左修剪灌木。


直到修剪了最左的灌木后再次调转方向。然后如此循环往复。


灌木每天从早上到傍晚会长高 1 厘米,而其余时间不会长高。


在第一天的早晨,所有灌木的高度都是 0 厘米。


爱丽丝想知道每棵灌木最高长到多高。


【输入格式】


一个正整数 N ,含义如题面所述。


【输出格式】


输出 N 行,每行一个整数,第行表示从左到右第 i 棵树最高能长到多高。


【样例输入】


3

【样例输出】


4

2

4

【评测用例规模与约定】


对于 30 % 的数据, N ≤ 10 .


对于 100 % 的数据, 1 < N ≤ 10000.


解题思路

找规律:



代码

#include 
#include 
using namespace std;
int main() {
  int n = 0;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
  printf("%d\n", max(i - 1, n - i) * 2);
  }
  return 0;
}

试题E:X进制减法

【问题描述】


进制规定了数字在数位上逢几进一。


X 进制是一种很神奇的进制,因为其每一数位的进制并不固定!


例如说某种 X 进制数,最低数位为二进制,第二数位为十进制,第三数位为八进制,


则 X 进制数 321 转换为十进制数为 65 。


现在有两个 X 进制表示的整数 A 和 B ,但是其具体每一数位的进制还不确定,


只知道 A 和 B 是同一进制规则,且每一数位最高为 N 进制,最低为二进制。


请你算出 A − B 的结果最小可能是多少。


请注意,你需要保证 A 和 B 在 X 进制下都是合法的,


即每一数位上的数字要小于其进制。


【输入格式】


第一行一个正整数 N ,含义如题面所述。


第二行一个正整数 Ma ,表示 X 进制数 A 的位数。


第三行 Ma 个用空格分开的整数,


表示 X 进制数 A 按从高位到低位顺序各个数位上的数字在十进制下的表示。


第四行一个正整数 Mb ,表示 X 进制数 B 的位数。


第五行 Mb 个用空格分开的整数,


表示 X 进制数 B 按从高位到低位顺序各个数位上的数字在十进制下的表示。


请注意,输入中的所有数字都是十进制的。


【输出格式】


输出一行一个整数,


表示 X 进制数 A − B 的结果的最小可能值转换为十进制后再模 1000000007 的结果。


【样例输入】


11

3

10 4 0

3

1 2 0

【样例输出】


94

【样例说明】


当进制为:最低位 2 进制,第二数位 5 进制,第三数位 11 进制时,减法得到的差最小。


此时 A 在十进制下是 108 , B 在十进制下是 14 ,差值是 94 。


【评测用例规模与约定】


对于 30 % 的数据, N ≤ 10;  Ma , Mb ≤ 8 .


对于 100 % 的数据, 2 ≤ N ≤ 1000;  1 ≤ Ma , Mb ≤ 100000;  A ≥ B .


解题思路

这道题第一件事,是要知道题目中X进制数该怎么转化成10进制,


以题目中给的 321 转化成 65 为例:


最低数位为二进制,第二数位为十进制,第三数位为八进制,


而这里的进制是用来表示:(进制规定了数字在数位上逢几进一)


所以,我们是以最低位的进制为基准的,核心思路如下:


八进制位是3,证明十进制的那个位进位了 3 次,才进位完,而十进制那里还剩2:


让 3 * 10 + 2,那么十进制位那里就是32了,


十进制位是 32 个,证明二进制的那个位进位了 32 次,才进位完,而二进制那里还剩1:


让 32 * 2 + 1,最后算出来的就是 65 了。


代码

#include 
#include 
using namespace std;
#define LL long long
const int N = 100010;
LL a[N], b[N], c[N];
LL mod = 1000000007;
int main()
{
  //输入
  LL n = 0;
  scanf("%lld", &n);
  LL ma = 0;
  scanf("%lld", &ma);
  for (LL i = 0; i < ma; i++) {
  scanf("%lld", &a[i]);
  }
  LL mb = 0;
  scanf("%lld", &mb);
  for (LL i = 0; i < mb; i++) {
  scanf("%lld", &b[i]);
  }
  reverse(a, a + ma);
  reverse(b, b + mb);
  //求出每一个位置的进制
  for (int i = 0; i < max(ma, mb); i++) {
  c[i] = max(max(a[i], b[i]) + 1, 2ll);
  }
  //运用刚刚分析的思路,将 A 和 B 的十进制求出 
  LL A = 0, B = 0;
  for (int i = ma - 1; i >= 0; i--) {
  A = ((A * c[i]) + a[i]) % mod;
  }
  for (int i = mb - 1; i >= 0; i--) {
  B = ((B * c[i]) + b[i]) % mod;
  }
  printf("%lld\n", (A - B + mod) % mod);
  return 0;
}

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。


如果喜欢本文的话,欢迎点赞和评论,写下你的见解。


如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。


之后我还会输出更多高质量内容,欢迎收看。  


相关文章
|
2月前
|
算法 测试技术 C++
【动态规划算法】蓝桥杯填充问题(C/C++)
【动态规划算法】蓝桥杯填充问题(C/C++)
|
2月前
|
人工智能 算法 BI
第十四届蓝桥杯省赛大学C组(C/C++)三国游戏
第十四届蓝桥杯省赛大学C组(C/C++)三国游戏
|
2月前
|
机器学习/深度学习 算法 关系型数据库
第十五届蓝桥杯C++B组省赛
第十五届蓝桥杯C++B组省赛
111 14
|
2月前
|
算法 C++
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
51 5
|
7月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-992 士兵杀敌(二)
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-992 士兵杀敌(二)
89 1
|
7月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
111 0
|
7月前
|
Java C语言 C++
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
86 0
|
7月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-999 数的潜能
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-999 数的潜能
88 0
|
7月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-997 粘木棍
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-997 粘木棍
93 0
|
7月前
|
机器学习/深度学习 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-996 车的放置
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-996 车的放置
94 0