• 小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
    ");
            else printf("No
    ");
        }
        return 0;
    }
    蒟蒻总是更懂你✿✿ヽ(°▽°)ノ✿
  • 相关阅读:
    HarmonyOS Java UI之AdaptiveBoxLayout布局示例
    【鸿蒙开发板试用报告】OneNet平台+开发板实时监控温湿度(一)
    安装了瑞友天翼4.0后出现了远程桌面无法连接的问题
    CISVC.EXE的资源占用
    Delphi如何在窗体标题栏添加按钮
    Delphi中捕捉窗体的最小化、最大化、还原消息
    打印机任务无法删除
    Delphi创建一个虚幻的层窗口(Win2000/XP)
    工资年结时提示“上年数据已经结转”
    Delphi中如何控制其他程序窗体上的窗口控件
  • 原文地址:https://www.cnblogs.com/WWHHTT/p/9793310.html
Copyright © 2020-2023  润新知