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

修建灌木

题目
在这里插入图片描述

思路

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

代码

#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;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

introversi0n

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

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

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

打赏作者

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

抵扣说明:

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

余额充值