修建灌木
题目
思路
每个灌木最大生长长度,为它本身位置到左右两端距离的最大值的两倍
代码
#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;
}