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

本文探讨了如何使用算法解决两个问题:一是计算灌木的最大生长长度,二是利用深度优先搜索和并查集计数满足特定条件的二极管灯组合方案。通过实例展示了代码实现,涉及空间复杂度和逻辑推理技巧。

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

修建灌木

题目
在这里插入图片描述

思路

每个灌木最大生长长度,为它本身位置到左右两端距离的最大值的两倍

代码

#include <iostream>
using namespace std;
int main()
{
  // 请在此输入您的代码
  int n; cin >> n;
  for(int i=1; i<=n; i++)
  {
    cout << 2*max(i-1, n-i) << endl;
  }
  return 0;
}

七段码

题目
在这里插入图片描述

思路

dfs+并查集

通过回溯枚举所有情况,对每个情况都进行并查集的集合归纳

最后判断7个二极管中开启的二极管,是否都归纳到一个集合中,是则方案数+1

最后输出方案数

代码

#include <iostream>
using namespace std;
const int N = 10;

int use[N]; // 代表灯的开关
int ans = 0; // 代表方案数
int e[N][N]; // 表示相邻的二极管
int fa[N]; // 表示并查集的父亲节点

void init(){
	/*	
		连边建图,e[i][j]==1表示i和j相邻
		a b c d e f g
		1 2 3 4 5 6 7
	*/
	e[1][2]=e[1][6]=1;
	e[2][1]=e[2][7]=e[2][3]=1;
	e[3][2]=e[3][4]=e[3][7]=1;
	e[4][3]=e[4][5]=1;
	e[5][4]=e[5][6]=e[5][7]=1;
	e[6][1]=e[6][5]=e[6][7]=1;
}

int find(int u){
	if(fa[u]==u) return u;
	fa[u]=find(fa[u]);
	return fa[u];
}//并查集


void dfs(int d)
{
  if(d==8)
  {
    // 用并查集,将二极管归到同一集合
    for(int i=1; i<=7; i++) fa[i] = i;// 初始化并查集父亲节点
    for(int i=1; i<=7; i++)
      for(int j=1; j<=7; j++)
        if(use[i] && e[i][j] && use[j])
        {
          // 将两者归到一个集合下
          fa[find(i)] = find(j);
        }

    int k=0;
    // 用并查集,统计枚举情况是否符合要求
    for(int i=1; i<=7; i++) 
      if(use[i] && fa[i]==i) k++; // 检查开着的二极管中,父节点是自己的节点个数
    if(k==1) ans++; // 如果只有一个,说明7个二极管中,只有一个集合
    return;
  }
  use[d]=1;
  dfs(d+1);
  use[d]=0;
  dfs(d+1);
}

int main()
{
  // 请在此输入您的代码
  init();
  dfs(1);
  cout << ans;
  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、付费专栏及课程。

余额充值