蓝桥杯C/C++百校真题赛题解——12.15日

本文介绍了如何将九进制正整数转换为十进制数,并提供了一个具体的转换实例。此外,还探讨了一种通过动态规划解决数字三角形问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

九进制转十进制

题目

填空题
九进制正整数 2022 转换成十进制等于多少?

思路
直接遍历每一个数字,并用进制转换公式即可

代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
  // 请在此输入您的代码
  string a = "2022";
  int length = a.size();
  int b[10] = {0};
  int ans=0;
  for(int i=0; i<length; i++)
  {
    b[i] = a[length-i-1]-'0';
    ans += b[i]*pow(9,i);
  }
  cout << ans;

  return 0;
}

数字三角形

题目
在这里插入图片描述
思路

先尝试了dfs,超时,只得了50分

接着使用动态规划,从下往上的递推,最终输出结果即可。

这里要注意,因为向左走和向右走的次数相差不能超过1,那么路径终点一定位于最后一行的中心区域,如果是偶数行,那么就是中间2个,如果是奇数行,那么就是中间1个。

代码

#include <iostream>
#include <math.h>
using namespace std;
int mat[110][110]={0};
int n;

int main()
{
  // 请在此输入您的代码

  cin >> n;

  // input
  for(int i=1; i<=n; i++)
  {
    for(int j=1; j<=i; j++)
    {
      cin >> mat[i][j];
      // 将非终点的点,设置为-10000,一定不会被计算。
      if(i==n && n%2==0 && j!=(n/2) && j!=(n/2)+1)
      {
        mat[i][j] = -10000;
      }
      if(i==n && n%2==1 && j!=(n/2)+1)
      {
        mat[i][j] = -10000;
      }
    }
  }

  // dp
  for(int i=n-1; i>=1; i--)
  {
    for(int j=1; j<=i; j++)
    {
      mat[i][j] += max(mat[i+1][j], mat[i+1][j+1]);
    }
  }

  cout << mat[1][1];
  return 0;
}
### 关于蓝桥杯 C/C++ A组的相关题解与资料 #### 蓝桥杯概述 蓝桥杯是一项面向全国大学生的编程比,其中C/C++分为多个组别,包括研究生组、大学A组、大学B组以及大学C组。这些组别的难度依次递减[^1]。 #### 大学A组的特点 对于C/C++大学A组而言,题目通常具有较高的复杂度和综合性,涉及算法设计、数据结构应用等多个方面。以下是针对一些典型问题的具体分析: --- #### 典型问题解析 ##### 问题1:兴趣小组成员统计 此问题是关于如何处理三个不同文件中的学生学号列表,并找出满足特定条件的学生数量。具体来说,目标是从给定的数据集中找到那些同时属于A组和B组但不属于C组的学生人数[^2]。 解决方法可以通过以下步骤实现(不使用自然语言描述顺序关系): - 使用哈希表或者集合来存储每组内的所有学号; - 对三组数据进行交集运算得到共同参与者; - 进一步排除掉也存在于第三组的情况;最后计算剩余元素的数量即可得出结果。 ```cpp #include <iostream> #include <unordered_set> #include <fstream> using namespace std; int main() { unordered_set<int> setA, setB, setC; ifstream fileA("A.txt"); int num; while (fileA >> num) { setA.insert(num); } fileA.close(); ifstream fileB("B.txt"); while (fileB >> num) { setB.insert(num); } fileB.close(); ifstream fileC("C.txt"); while (fileC >> num) { setC.insert(num); } fileC.close(); // 计算(A ∩ B) - C 的大小 int count = 0; for(auto &n : setA){ if(setB.find(n)!=setB.end() && setC.find(n)==setC.end()) ++count; } cout << count; } ``` 上述代码片段展示了通过读取文本文件并利用标准模板库(STL)容器完成所需操作的一种方式。 --- ##### 问题2:图论路径计数 另一个例子来源于第十二届比中的一道经典图论问题——基于节点间的互质关系构建连通图,并求解汉密尔顿回路总数[^3]。 这类问题往往需要借助深度优先搜索(DFS)或动态规划(DP)技术来进行状态转移推导,在实际编码过程中还需要特别关注边界情况及性能优化措施。 ```cpp // 示例伪代码展示可能的解决方案框架 void dfs(int current_node, vector<bool>& visited, long& total_ways); bool is_coprime(int a, int b); long solve_hamiltonian_cycle(){ const int N=21; vector<vector<int>> adjacency_matrix(N+1,vector<int>(N+1)); // 初始化邻接矩阵... vector<bool> visited(N+1,false); long ways_count=0; dfs(1,visited,ways_count); return ways_count; } void dfs(int current_node, vector<bool>& visited, long& total_ways){ if(all nodes are visited and can go back to start node){ total_ways +=1 ; return; } foreach neighbor of current_node{ if(!visited[neighbor]){ mark as visited; call dfs recursively on this new state; unmark after recursion returns; } } } ``` 以上仅提供了一个简化版的概念模型用于说明思路。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

introversi0n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值