蓝桥杯第十一届国赛题目B组C++

A 美丽的2

【问题描述】
小蓝特别喜欢2,今年是公元2020年,他特别高兴。
他很好奇,在公元1年到公元2020年(包含)中,有多少个年份的数位中包含数字2?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n = 2020;
    int sum = 0;
    for (int i = 0; i <=n; i++){
        int temp = i;
        while(temp>0){
            if(temp%10==2){
                sum++;
                break;
            }
            temp = temp / 10;
        }
    }
    cout << sum << endl;
    return 0;
}

答案:563

B:扩散

【问题描述】
小蓝在一张无限大的特殊画布上作画。
这张画布可以看成一个方格图,每个格子可以用一个二维的整数坐标表示。小蓝在画布上首先点了一下几个点:(0,0),(2020,11),(11,14),(2000,2000)。只有这几个格子上有黑色,其它位置都是白色的。
每过一分钟,黑色就会扩散一点。具体的,如果一个格子里面是黑色,它就会扩散到上、下、左、右四个相邻的格子中,使得这四个格子也变成黑色(如果原来就是黑色,则还是黑色)。
请问,经过2020分钟后,画布上有多少个格子是黑色的。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
题解:直接把所有的可能到达的到初始的点的距离进行运算,就可以得到最终的结果的

#include<bits/stdc++.h>
using namespace std;
//(0,0),(2020,11),(11,14),(2000,2000)
int main(){
    long long sum = 0;
    for (int i = -5000; i <= 5000;i++){
        for (int j = -5000; j <= 5000;j++){
            if(((abs(i-0)+abs(j-0))<=2020)||((abs(i-2020)+abs(j-11))<=2020)||((abs(i-11)+abs(j-14))<=2020)||((abs(i-2000)+abs(j-2000))<=2020)){
                sum++;
            }
        }
    }
    cout << sum << endl;
    return 0;
}

答案:20312088

C阶层约数

【问题描述】
定义阶乘n!=1×2×3×··×n。
请问100! (100的阶乘)有多少个约数。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

https://blog.youkuaiyun.com/weixin_46239370/article/details/109707904

可以去看这个博客的

D:本质上升序列

【问题描述】
小蓝特别喜欢单调递增的事物。
在一个字符串中,如果取出若干个字符,将这些字符按照在字符串中的顺序排列后是单调递增的,则成为这个字符串中的一个单调递增子序列。
例如,在字符串 lanqiao 中,如果取出字符n和 q,则nq组成一个单调递增子序列。类似的单调递增子序列还有lnq、 i、 ano 等等。
小蓝发现,有些子序列虽然位置不同,但是字符序列是一样的,例如取第二个字符和最后一个字符可以取到 ao,取最后两个字符也可以取到ao。小蓝认为他们并没有本质不同。
对于一个字符串,小蓝想知道,本质不同的递增子序列有多少个?
例如,对于字符串 lanqiao,本质不同的递增子序列有21个。它们分别是l、a、n、q、 i、o、ln、an、lq、aq、nq、ai、lo、ao、no、io、lnq、anq、 lno、 ano、 aio。
请问对于以下字符串(共200个小写英文字母,分四行显示):(如果你把以下文字复制到文本文件中,请务必检查复制的内容是否与文档中的一致。在试题目录下有一个文件 inc.txt,内容与下面的文本相同>
tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhfiadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqijgihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmadvrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkghfwl
本质不同的递增子序列有多少个?

不会写

E:玩具蛇

在这里插入图片描述
题解:就是当你进行DFS进行访问的时候,要进行提前进行判断退出递归的,不然可能会导致时间超时的。

#include<bits/stdc++.h>
using namespace std;
vector<vector<int>> vis(4, vector<int>(4, 0));
long long sum = 0;
void dfs(int i, int j,int len){
     if(vis[i][j]==1){
         return;
     }
     if (len == 16)
    {
         sum++;
         return;
    }
    vis[i][j] = 1;
    if(i-1>=0){
        dfs(i-1, j, len + 1);
    }
    if(j-1>=0){
        dfs(i, j-1, len + 1);
    }
    if(i+1<4){
        dfs(i+1, j, len + 1);
    }
    if(j+1<4){
        dfs(i, j+1, len + 1);
    }
    vis[i][j] = 0;
   
}
int main(){
    for (int i = 0; i < 4;i++){
        for (int j = 0; j < 4;j++){
            dfs(i, j,1);
        }
    }
    cout << sum << endl;
    return 0;
}

答案:552

F: 皮亚诺曲线距离

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述考试写的忘记了,大概意思就是找出两个点之间的3*3的小块,那么中间路径就可以不用考虑,就只用考虑两个自己分别在的小块应该被当做多少路径来进行计算的,3*3的小块只有四种状态,两种形状和进出方向不同,可以通过输入的X和Y得到位置和对应的形状就可以了,这道题测试用例应该比较弱的,没有考虑太多的情况,

G: 游园安排

H: 答疑

在这里插入图片描述在这里插入图片描述

贪心,排序,每次选最小的那个

I: 出租车

J: 质数行者

应该是一个DP问题的,假如没有两个陷阱点,那么x,y,z每条路径分别有xn,yn,zn种走法
(背包问题,物品数没有限制的背包问题,详情见背包9),那么总的走法xn*yn*zn;
之后怎么把两个陷阱点对应的路径进去,就是要把从陷阱点到终点的那些路径都去掉,那么也是一个背包,但是两个陷阱点使用DP可能会有重复



总结:由于某些原因导致写第一题有点慌张,导致没有看含有2的年份,我把所有的二都考虑进去。那么最后应该是两道填空题和三个 半个代码题。
成绩出来是一个国二

### 第十四届蓝桥杯青少 C++ 题目及解答 #### 背景介绍 第十四届蓝桥杯作为一项面向全范围内的编程竞,吸引了众多青少参与。其中,C++ 是主要使用的编程语言之一。以下是关于该事的一些典型题目及其解题思路。 --- #### 1. **暴力枚举类问题** 此类问题是通过穷尽所有可能情况来寻找最优解的一种方法。以下是一个典型的例子: ##### 示例代码 ```cpp #include <bits/stdc++.h> using namespace std; #define ll long long ll n, m; ll ans = 0; ll flag = 0; void check(ll x) { if (x % 2023 == 0) { // 判断条件 ans = max(ans, x); flag = 1; } } void dfs(ll tn, ll tm, ll x) { if (flag == 1) return; // 提前终止 if (tn == 0 && tn == tm) { // 边界条件 check(x); return; } if (tm != 0 && flag == 0) dfs(tn, tm - 1, x * 10 + 3); // 枚举路径 if (tn != 0 && flag == 0) dfs(tn - 1, tm, x * 10 + 2); // 枚举路径 } int main() { cin >> n >> m; dfs(n, m, 0); cout << ans << endl; return 0; } ``` 上述代码实现了一个基于深度优先搜索(DFS)的暴力枚举算法[^1]。它适用于解决一些具有固定约束的小规模问题。 --- #### 2. **AB路线问题** 此问题涉及两个点之间的最短路径计算,通常可以通过动态规划或者广度优先搜索(BFS)求解。 ##### 解题思路 假设起点为 A,终点为 B,则可以采用 BFS 来遍历所有的可能性并记录最小步数。具体步骤如下: - 使用队列存储当前状态; - 对每一个节点扩展其可达的状态; - 记录访问过的节点以避免重复计算。 ##### 示例代码 ```cpp #include <bits/stdc++.h> using namespace std; const int MAX_N = 1e5 + 5; bool visited[MAX_N]; queue<int> q; int bfs(int start, int end) { memset(visited, false, sizeof(visited)); q.push(start); visited[start] = true; int steps = 0; while (!q.empty()) { int size = q.size(); for (int i = 0; i < size; ++i) { int current = q.front(); q.pop(); if (current == end) return steps; vector<int> next_steps = {current + 1, current - 1}; // 扩展规则 for (auto next : next_steps) { if (next >= 0 && !visited[next]) { visited[next] = true; q.push(next); } } } steps++; } return -1; // 如果无法到达目标返回 -1 } int main() { int a, b; cin >> a >> b; cout << bfs(a, b) << endl; return 0; } ``` 这段代码实现了从 A 到 B 的最短路径计算逻辑[^2]。 --- #### 3. **班级活动问题** 这是一个经典的贪心算法应用案例,核心在于如何合理分配有限资源以达到全局最优效果。 ##### 示例代码 ```python n = int(input()) numbers = list(map(int, input().split())) ds = {} for t in numbers: if t not in ds.keys(): ds[t] = 1 else: ds[t] += 1 x = 0 # 待分配 ID 的学生数量 y = 0 # 已经有超过两个相同 ID 的学生数量 for key in ds.keys(): if ds[key] == 1: x += 1 elif ds[key] > 2: y += ds[key] - 2 if x <= y: # 若待分配的学生较少,则只需调整已有冲突的学生 print(y) else: # 否则还需要额外两两配对学生 print((x - y) // 2 + y) ``` 以上 Python 实现展示了如何利用字典统计频率,并根据实际情况决定最终的操作方案[^3]。 --- #### 4. **合并数列问题** 给定多个有序数,将其合并成一个新的有序数是一种常见的操作需求。这里提供一种简单有效的解决方案。 ##### 示例代码 ```cpp #include <vector> #include <algorithm> using namespace std; vector<int> mergeSortedArrays(const vector<vector<int>>& arrays) { vector<int> result; for (const auto& array : arrays) { result.insert(result.end(), array.begin(), array.end()); } sort(result.begin(), result.end()); // 排序整个结果集 return result; } int main() { vector<vector<int>> inputs = {{1, 3, 5}, {2, 4, 6}}; vector<int> mergedArray = mergeSortedArrays(inputs); for (int num : mergedArray) { cout << num << " "; } return 0; } ``` 这种方法先将所有子数拼接在一起再统一排序,适合处理中小规模数据集合。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值