比赛 |
2025暑期集训第7场 |
评测结果 |
AAAAAAAAAA |
题目名称 |
倒水 |
最终得分 |
100 |
用户昵称 |
李金泽 |
运行时间 |
0.179 s |
代码语言 |
C++ |
内存使用 |
15.36 MiB |
提交时间 |
2025-08-11 16:08:47 |
显示代码纯文本
#include<cstdio>
#include<queue>
#define ri register int
#define N 1000005
using namespace std;
int ma,mb,mc,x,A[N],B[N],C[N],a,b,c,ans;bool vis[N];
struct node{int v,t;};
queue<node>q;
inline int min(int x,int y){return x<y?x:y;}
int bfs(){
q.push({ma*10000,0});vis[ma*10000]=1;
while(q.size())
{
node u=q.front();q.pop();
a=A[u.v],b=B[u.v],c=C[u.v];
if(a==x||b==x||c==x)return u.t;
if(a&&b^mb)
{
int y=min(a,mb-b),v=(a-y)*10000+(b+y)*100+c;
if(!vis[v])
{
vis[v]=1;
q.push({v,u.t+1});
}
}
if(a&&c^mc)
{
int y=min(a,mc-c),v=(a-y)*10000+b*100+c+y;
if(!vis[v])
{
vis[v]=1;
q.push({v,u.t+1});
}
}
if(b&&a^ma)
{
int y=min(b,ma-a),v=(a+y)*10000+(b-y)*100+c;
if(!vis[v])
{
vis[v]=1;
q.push({v,u.t+1});
}
}
if(b&&c^mc)
{
int y=min(b,mc-c),v=a*10000+(b-y)*100+c+y;
if(!vis[v])
{
vis[v]=1;
q.push({v,u.t+1});
}
}
if(c&&a^ma)
{
int y=min(c,ma-a),v=(a+y)*10000+b*100+c-y;
if(!vis[v])
{
vis[v]=1;
q.push({v,u.t+1});
}
}
if(c&&b^mb)
{
int y=min(c,mb-b),v=a*10000+(b+y)*100+c-y;
if(!vis[v])
{
vis[v]=1;
q.push({v,u.t+1});
}
}
}
return -1;
}
int main(){
freopen("pourwater.in","r",stdin);freopen("pourwater.out","w",stdout);
for(ri i=1;i<N;i++)
{
C[i]=i%100;
B[i]=((i-C[i])/100)%100;
A[i]=((i-C[i])-B[i]*100)/10000;
}
scanf("%d%d%d%d",&ma,&mb,&mc,&x);
if(ma<x)return !printf("false");
if(ma==x)return !printf("0");
ans=bfs();
if(~ans)printf("%d",ans);
else printf("false");
return 0;
}