小M的算式

【问题描述】
小 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\n");
        else printf("No\n");
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/WWHHTT/p/9793310.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值