zoukankan      html  css  js  c++  java
  • HDU6646 A + B = C

    题意

    给三个数a,b,c,问是否存在(a*10^n+b*10^m=c*10^k)
    题目链接

    思路

    将a,b,c末尾的零去掉得到A,B,C,考虑几种情况,其中(n,m,k>0)。

    1. (A*10^n+B=C*10^k)不合法
    2. (A+B*10^m=C*10^k)不合法
    3. (A*10^n+B*10^m=C)不合法
    4. (A+B=C*10^k)
    5. (A*10^n+B=C)
    6. (A+B*10^m=C)
    7. (A+B=C)

    对于5,6,7三种情况,尝试用C-A,C-B,看是否能与另一个匹配。对于4,用A+B看是否于C匹配。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 100000+10;
    
    int na,nb,nc,nd;
    char s[maxn];
    int a[maxn],b[maxn],c[maxn],d[maxn];
    int numa,numb,numc;
    
    bool xiao(int a[],int na,int b[],int nb)
    {
        if (na<nb) return 1;
        if (na>nb) return 0;
        for (int i=na-1;i>=0;i--)
        {
            if (a[i]<b[i]) return 1;
            if (a[i]>b[i]) return 0;
        }
        return 0;
    }
    
    void jian(int a[],int na,int b[],int nb)
    {
        nd=na;
        memset(d,0,sizeof(d));
        int o=0;
        for (int i=0;i<na;i++)
        {
            d[i]=(a[i]+o-b[i]+10)%10;
            if (a[i]+o-b[i]<0) o=-1; else o=0;
        }
        while (nd>1&&d[nd-1]==0) nd--;
    }
    
    void add(int a[],int na,int b[],int nb)
    {
        nd=max(na,nb);
        memset(d,0,sizeof(d));
        int o=0;
        for (int i=0;i<nd;i++)
        {
            d[i]=(a[i]+b[i]+o)%10;
            o=(a[i]+b[i]+o)/10;
        }
        if (o) d[nd++]=1;
    }
    
    bool cmp(int a[],int la,int ra,int b[],int lb,int rb)
    {
        if (ra-la!=rb-lb) return 0;
        for (int i=0;i<ra-la;i++)
        {
            if (a[la+i]!=b[lb+i]) return 0;
        }
        return 1;
    }
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while (T--)
        {
            memset(a,0,sizeof(a)); numa=0;
            memset(b,0,sizeof(b)); numb=0;
            memset(c,0,sizeof(c)); numc=0;
            scanf("%s",s);
            na=strlen(s);
            while (na>1&&s[na-1]=='0') na--,numa--;
            for (int i=0;i<na;i++) a[i]=s[na-i-1]-'0';
    
            scanf("%s",s);
            nb=strlen(s);
            while (nb>1&&s[nb-1]=='0') nb--,numb--;
            for (int i=0;i<nb;i++) b[i]=s[nb-i-1]-'0';
    
            scanf("%s",s);
            nc=strlen(s);
            while (nc>1&&s[nc-1]=='0') nc--,numc--;
            for (int i=0;i<nc;i++) c[i]=s[nc-i-1]-'0';
    
            int tmp,p;
            if (xiao(b,nb,c,nc))
            {
                jian(c,nc,b,nb);
                p=0;
                while (d[p]==0) p++;
                if (cmp(a,0,na,d,p,nd))
                {
                    numa+=p;
                    tmp=min(min(numa,numb),numc);
                    if (tmp<0) numa-=tmp,numb-=tmp,numc-=tmp;
                    printf("%d %d %d
    ",numa,numb,numc);
                    continue;
                }
            }
    
            if (xiao(a,na,c,nc))
            {
                jian(c,nc,a,na);
                p=0;
                while (d[p]==0) p++;
                if (cmp(b,0,nb,d,p,nd))
                {
                    numb+=p;
                    tmp=min(min(numa,numb),numc);
                    if (tmp<0) numa-=tmp,numb-=tmp,numc-=tmp;
                    printf("%d %d %d
    ",numa,numb,numc);
                    continue;
                }
            }
    
            add(a,na,b,nb);
            p=0;
            while (d[p]==0) p++;
            if (cmp(c,0,nc,d,p,nd))
            {
                numc+=p;
                tmp=min(min(numa,numb),numc);
                if (tmp<0) numa-=tmp,numb-=tmp,numc-=tmp;
                printf("%d %d %d
    ",numa,numb,numc);
                continue;
            }
    
            printf("-1
    ");
        }
        return 0;
    }
    
  • 相关阅读:
    mysql性能分析工具
    vim使用大全
    Vue computed属性
    模板题 + KMP + 求最小循环节 --- HDU 3746 Cyclic Nacklace
    Greedy --- HNU 13320 Please, go first
    DFS --- HNU 13307 Galaxy collision
    HNU 13308 Help cupid
    Linux
    dp
    2015 Multi-University Training Contest 2 1006 Friends
  • 原文地址:https://www.cnblogs.com/zhanggengchen/p/11426388.html
Copyright © 2011-2022 走看看