专栏文章
题解:B4400 [蓝桥杯青少年组国赛 2025] 第五题
B4400题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mio2f7az
- 此快照首次捕获于
- 2025/12/02 12:15 3 个月前
- 此快照最后确认于
- 2025/12/02 12:15 3 个月前
感觉这题是整场比赛唯一难度到达绿的题。还是靠 种情况的分类讨论搭起来的。
考虑建图, 代表第一个桶剩余 ,第二个剩余 和第三个剩余 。那么 BFS 计算 到所有 的距离的最小值即可。注意如果 不是整数则显然无解。
赛时写挂了/fn/fn/fn
代码&提交记录
CPP#include <cstdio>
#include <queue>
#include <tuple>
#include <cstring>
#include <algorithm>
using namespace std;
int dist[205][205][205];
class node
{
public:
int x, y, z;
};
// x -> y
// 赛时不能用 tuple。
tuple<int, int, int> pure(int x, int y, int z, int X, int Y, int Z)
{
int g = min(x, Y - y);
return {x - g, y + g, z};
}
int main()
{
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
if(x & 1)
{
printf("-1\n");
return 0;
}
queue<node> q;
memset(dist, 0x3f, sizeof dist);
q.push({x, 0, 0});
dist[x][0][0] = 0;
while(!q.empty())
{
auto u = q.front();
q.pop();
if(u.x == x / 2 || u.y == x / 2 || u.z == x / 2)
{
printf("%d\n", dist[u.x][u.y][u.z]);
return 0;
}
// x -> y
// 赛时也不能用结构化绑定
{ auto [xx, yy, zz] = pure(u.x, u.y, u.z, x, y, z); if(dist[u.x][u.y][u.z] + 1 < dist[xx][yy][zz]) { dist[xx][yy][zz] = dist[u.x][u.y][u.z] + 1; q.push({xx, yy, zz}); }}
// x -> z
{ auto [xx, zz, yy] = pure(u.x, u.z, u.y, x, z, y); if(dist[u.x][u.y][u.z] + 1 < dist[xx][yy][zz]) { dist[xx][yy][zz] = dist[u.x][u.y][u.z] + 1; q.push({xx, yy, zz}); }}
// y -> z
{ auto [yy, zz, xx] = pure(u.y, u.z, u.x, y, z, x); if(dist[u.x][u.y][u.z] + 1 < dist[xx][yy][zz]) { dist[xx][yy][zz] = dist[u.x][u.y][u.z] + 1; q.push({xx, yy, zz}); }}
// y -> x
{ auto [yy, xx, zz] = pure(u.y, u.x, u.z, y, x, z); if(dist[u.x][u.y][u.z] + 1 < dist[xx][yy][zz]) { dist[xx][yy][zz] = dist[u.x][u.y][u.z] + 1; q.push({xx, yy, zz}); }}
// z -> x
{ auto [zz, xx, yy] = pure(u.z, u.x, u.y, z, x, y); if(dist[u.x][u.y][u.z] + 1 < dist[xx][yy][zz]) { dist[xx][yy][zz] = dist[u.x][u.y][u.z] + 1; q.push({xx, yy, zz}); }}
// z -> y
{ auto [zz, yy, xx] = pure(u.z, u.y, u.x, z, y, x); if(dist[u.x][u.y][u.z] + 1 < dist[xx][yy][zz]) { dist[xx][yy][zz] = dist[u.x][u.y][u.z] + 1; q.push({xx, yy, zz}); }}
}
printf("-1\n");
return 0;
}
rec。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...