记录编号 |
604774 |
评测结果 |
AAAAAAAAAA |
题目名称 |
3659.[SYOI 2022]倒水 |
最终得分 |
100 |
用户昵称 |
左清源 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.031 s |
提交时间 |
2025-08-11 19:25:40 |
内存使用 |
4.11 MiB |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int ans,a,b,c,x,A,B,C,cnt;
int f[101][101][101];
bool mk[101][101][101];
struct node{int a,b,c;};
queue<node>q;
int main(){
freopen("pourwater.in","r",stdin);
freopen("pourwater.out","w",stdout);
cin>>A>>B>>C>>x;
f[A][0][0]=0;mk[A][0][0]=1;
q.push(node{A,0,0});
ans=0x3f3f3f3f;
while(q.size()){
node t=q.front();q.pop();
a=t.a,b=t.b,c=t.c;
// a -> b
cnt=min(a,B-b);
if(!mk[a-cnt][b+cnt][c]){
f[a-cnt][b+cnt][c]=f[a][b][c]+1;
mk[a-cnt][b+cnt][c]=1;
q.push(node{a-cnt,b+cnt,c});
}
// a -> c
cnt=min(a,C-c);
if(!mk[a-cnt][b][c+cnt]){
f[a-cnt][b][c+cnt]=f[a][b][c]+1;
mk[a-cnt][b][c+cnt]=1;
q.push(node{a-cnt,b,c+cnt});
}
// b -> a
cnt=min(b,A-a);
if(!mk[a+cnt][b-cnt][c]){
f[a+cnt][b-cnt][c]=f[a][b][c]+1;
mk[a+cnt][b-cnt][c]=1;
q.push(node{a+cnt,b-cnt,c});
}
// b -> c
cnt=min(b,C-c);
if(!mk[a][b-cnt][c+cnt]){
f[a][b-cnt][c+cnt]=f[a][b][c]+1;
mk[a][b-cnt][c+cnt]=1;
q.push(node{a,b-cnt,c+cnt});
}
// c -> a
cnt=min(c,A-a);
if(!mk[a+cnt][b][c-cnt]){
f[a+cnt][b][c-cnt]=f[a][b][c]+1;
mk[a+cnt][b][c-cnt]=1;
q.push(node{a+cnt,b,c-cnt});
}
// c -> b
cnt=min(c,B-b);
if(!mk[a][b+cnt][c-cnt]){
f[a][b+cnt][c-cnt]=f[a][b][c]+1;
mk[a][b+cnt][c-cnt]=1;
q.push(node{a,b+cnt,c-cnt});
}
if(a==x||b==x||c==x)ans=min(ans,f[a][b][c]);
}
if(ans>=0x3f3f3f3f)printf("false\n");
else printf("%d\n",ans);
return 0;
}