【教练】题解
一、考试的情况
看完题基本是立马有了思路,然后开始打代码,写了 10 min 10 \min 10min 左右就过了所有样例,就直接放下了。提交时看到只有 80 80 80 分,当时也没怎么留意,觉得肯定有点问题。但郭老师讲这道题的时候随意看了一下自己的代码,发现:
心态崩掉。
二、分析
题目要求要使每个人都在长度为 3 3 3 的队伍中,不能有其他情况。可以使用并查集维护每个团队。
当输入完后,就可以提前算出一部分可以确定的组队方案。此时,若已有团队的长度大于 3 3 3,则肯定不行。(这是一个小优化)
但现在,还剩下一些不确定的人需要互相组合,设当前元素为 i i i,所在集合的长度为 s i z e i size_i sizei。那么有 3 3 3 种情况:
- s i z e i = 3 size_i=3 sizei=3。即已经完成组队,不处理。
- s i z e i = 2 size_i=2 sizei=2。此时只需要再来一个单独的人 j j j( s i z e j = 1 size_j=1 sizej=1)与之匹配,这样它们加起来长度就是 2 + 1 = 3 2+1=3 2+1=3,即完成组队。在 [ 1 , n ] [1,n] [1,n] 枚举满足条件的 j j j 即可。处理完后,若还剩下 s i z e i = 2 size_i=2 sizei=2 的情况,说明没有足够的 s i z e j size_j sizej=1 与 i i i 组队,那么肯定不行。(这又是一个小优化)
-
s
i
z
e
i
=
1
size_i=1
sizei=1。此时又分为
2
2
2 种情况。
- 找另一个 j j j( s i z e j = 2 size_j=2 sizej=2)。但因为上面已经处理了 s i z e i = 2 size_i=2 sizei=2 的情况,也就意味着 s i z e i = 2 size_i=2 sizei=2 的人已经确定了。所以现在肯定没有 s i z e j = 2 size_j=2 sizej=2 能与之匹配。
- 再找两个 s i z e j = 1 size_j=1 sizej=1。实际上就是把所有的 1 1 1 合并。因为 i i i 是从小到大,则前面 [ 1 , i − 1 ] [1,i-1] [1,i−1] 都被扫描过,所以它们最终都会变为长度为 3 3 3 的团队,不可能与 i i i 匹配。那么直接在 [ i + 1 , n ] [i+1,n] [i+1,n] 枚举 j j j 即可。
将所有不确定的人组完队后,我们只需要判断 i i i 所在的团队长度是否为 3 3 3,若不,则说明无论如何都不能完成组队了。
输出时,对于每个
i
i
i,将
i
i
i 所在的集合的所有元素直接输出。用一个 bool
型数组动态维护
i
i
i 是否输出过即可。
三、代码
for(int i = 1;i <= m; ++i) {
scanf("%d %d", &a, &b);
Union_Set(a, b);
if(size[Find_Set(b)] > 3) {
puts("-1");
return 0;
}
}
for(int i = 1;i <= n; ++i)
if(size[Find_Set(i)] == 2)
for(int j = 1;j <= n; ++j)
if(size[Find_Set(j)] == 1) {
Union_Set(i, j);
break;
}
for(int i = 1;i <= n; ++i)
if(size[Find_Set(i)] == 1)
for(int j = i + 1;j <= n; ++j) {
if(size[Find_Set(j)] == 1) Union_Set(i, j);
if(size[Find_Set(i)] == 3) break;
}
for(int i = 1;i <= n; ++i)
if(size[Find_Set(i)] != 3) {
puts("-1");
return 0;
}
for(int i = 1;i <= n; ++i)
if(!flag[i]) {
printf("%d ", i);
for(int j = i + 1;j <= n; ++j)
if(Find_Set(i) == Find_Set(j) and !flag[j]) {
printf("%d ", j);
flag[j] = 1;
}
puts("");
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现