比赛 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;
}