【问题描述】
小 M 在做数学作业的时候遇到了一个有趣的问题:有一个长度为 n 的数字
串 S,小 M 需要在数字之间填入若干个“+”和恰好一个“=”,使其成为一个
合法的等式。如对于 S=“2349”,可以通过添加 2个“+”和 1 个“=”成为
“2+3+4=9”。
小 M 发现有些数字串是无法通过添加符号成为一个合法的等式的,她想知
道对于每一个给定的数字串 S,是否可以通过添加符号使之成为一个合法的等
式(允许前导 0)?
【输入】
第一行为数据组数 T,表示有 T组输入数据。
接下来 T行每行一个数字串 S。
【输出】
对于每组数据,若 S可以成为合法的等式,输出“Yes”,否则输出
“No”,以单行回车隔开。
【输入输出样例】
4
2349
233233
122323
2344322322
Yes
Yes
No
Yes
【输入输出样例解释】
2+3+4=9
233=233
2+34=4+3+2+2+3+22
【数据范围】
对于 50%的数据:1 ≤ T ≤ 3,1 ≤ n ≤ 4。
对于 100%的数据:1 ≤ T ≤ 5,1 ≤ n ≤ 10。
王神爷考试T1,反正也是用来放松心态的,不用太较真
对于每个地方有三种情况,放等号,放加号,不放
下面给出代码:
#include<iostream> #include<cstring> #include<algorithm> #include<string> #include<cstdio> #include<cstdlib> #include<cmath> using namespace std; inline int rd(){ int x=0,f=1; char ch=getchar(); for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1; for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0'; return x*f; } inline void write(int x){ if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0'); return ; } char a[10006]; char s[10006]; int set[10006]; int n; int len; int f=0; bool check(){ int sum=0,b=0,h=0,flag=0;; for(int i=1;i<len;i++){ if(s[i]=='+'||s[i]=='='){ int v=0; for(int j=h+1;j<=i;j++) v=v*10+a[j]-'0'; if(!flag) sum+=v; else b+=v; h=i; if(s[i]=='=') flag=1; } } int v=0; for(int i=h+1;i<=len;i++) v=v*10+a[i]-'0'; b+=v; /*for(int i=1;i<=len;i++){ cout<<a[i]<<s[i]; } cout<<endl; cout<<sum<<" "<<b<<endl;*/ if(sum==b) return 1; return 0; } int pos=0; void dfs(int x,int d){ if(f==1) return ; if(x==len){ if(!d) return ; if(check()) f=1; return ; } s[x]='+'; dfs(x+1,d); if(!d){ s[x]='='; dfs(x+1,1); } s[x]=' '; dfs(x+1,d); return ; } int main(){ n=rd(); while(n--){ scanf("%s",a+1); len=strlen(a+1); f=0; dfs(1,0); if(f) printf("Yes "); else printf("No "); } return 0; }