[CF58E] Expression 题解

[CF58E] Expression

上面的题解说的都不怎么详细。虽然是道搜索题,但是不能胡搜,搜的思路还是值得学习的。

首先需要明确,为了使最终的答案尽可能短,我们应该尽可能少地创造新的数位,所以盲目枚举左右两边加什么数是不可取的,我们应该从低位向高位依次判断

搜到当前位时,分为两种情况:当前位满足要求、当前位不满足要求。若当前位满足要求,我们就不需要再考虑当前位了,开始考虑高位,所以我们给当前循环的 a,b,c 全部 ÷10;若当前位不满足要求,我们再一一枚举 a,b,c,给 a,b,c 的最后一位加上一个数字然后继续搜。同样是因为我们应该尽可能少地创造新的数位,所以一旦我们给一个数的最后一位加上一个数字 i(即 aa×10+ib,c 同理),这个 i 直接就是 cb 的个位的差值。同理,如果是 b 就是 ca 的个位的差值,c 就是 ab 的个位的和。别忘了考虑进位。

需要特判的是当 c=0 时,这时我们只需要将 c 的最高位处理成 a+b+进位 即可。

代码和 MilkyCoffee 的差不多。

#include<bits/stdc++.h>
#define int long long
using namespace std;

constexpr double pw[]={1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10,1e11,1e12,1e13,1e14,1e15,1e16,1e17,1e18,1e19};
int A,B,C,ans=2e18;

void dfs(int a,int b,int c,int jw,int aa,int bb,int cc,int dep,int now){
	if(now>=ans) return;
	if(!a&&!b&&!c&&!jw){
		ans=now,A=aa,B=bb,C=cc;
		return;
	}
	if(!c){
		dfs(0,0,0,0,aa+pw[dep]*a,bb+pw[dep]*b,cc+pw[dep]*(a+b+jw),dep+1,now+floor(log10(a+b+jw))+1);
		return;
	}
	if((a+b+jw)%10==c%10){
		dfs(a/10,b/10,c/10,(a%10+b%10+jw)/10,aa+(a%10)*pw[dep],bb+(b%10)*pw[dep],cc+(c%10)*pw[dep],dep+1,now);
		return;
	}
	dfs(a*10+(c%10-b%10-jw+10)%10,b,c,jw,aa,bb,cc,dep,now+1);
	dfs(a,b*10+(c%10-a%10-jw+10)%10,c,jw,aa,bb,cc,dep,now+1);
	dfs(a,b,c*10+(a%10+b%10+jw)%10,jw,aa,bb,cc,dep,now+1);
}

signed main(){
	int a,b,c;
	scanf("%lld+%lld=%lld",&a,&b,&c);
	dfs(a,b,c,0,0,0,0,0,0);
	printf("%lld+%lld=%lld\n",A,B,C);
	return 0;
}
posted @   Laoshan_PLUS  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示