1 solutions

  • 0
    @ 2022-11-28 13:24:27

    这道题主要还是要处理好细节,按照题意一步一步来就没什么问题了。 首先我们要把从0~9这10个数字所需要的火柴通过数组来进行储存。

    int a[N]={6,2,5,5,4,5,6,3,7,6};
    int a[N]={6,2,5,5,4,5,6,3,7,6};int a[N]={6,2,5,5,4,5,6,3,7,6};
    int a[N]={6,2,5,5,4,5,6,3,7,6};
    

    并且我们需要10~1000这些数所需要的火柴,这就要把数拆分成一位一位的来进行火柴计算

    
    for(int i=10;i<100000;i++){
            int p=i;
            while(p>9){
                int m=p%10;
                a[i]+=a[m];
                p/=10;
            }
            a[i]+=a[p];
        }
    
    

    然后我们就可以看到他是加号和等号也是需要火柴的(这里就直接记上,”+“需要2根,“=”也是需要两根,这里特别注意还有“==”这是需要4根火柴的),这里A+B=C,与B+A=C是不同的两个等式,那么我们就要注意当A与B不一样的时候,我们就要交换AB的位置,就又可以成为一个新的等式,所以直接乘2。

    这里tt是表示所拥有的火柴中减去ABC还有+号和一个”=“所剩下的火柴,这里就要对”=“和”“来进行特别处理,如果还剩2个以上,那么就可以用”“表示来那么我们就直接加2种方案,如果A和B不同那我们再加2种方案。如果剩下的不足摆出”==“那我们就只有加’=‘的一种方案。

       if(tt>=2) {
    		//cout<<i<<"+"<<j<<"=="<<i+j<<endl;
    		if(i!=j) ans+=2;
    				ans+=2;
    			}else if(tt>=0){ 
    				//cout<<i<<"+"<<j<<"="<<i+j<<endl;
    				if(i!=j) ans++;
    				ans++;
    			}
    
    

    因为A和B都是到1000所以可以直接循环来找。 最终代码:

    
    #include<iostream>
    #include<cstdio>
    #include<string.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<algorithm>
    #include<stack>
    #include<queue>
    #define lowbits(x) ((-x)&x)
    using namespace std;
    const int INF = 0x3f3f3f3f;
    const int N = 1e5+5;
    typedef long long ll;
    int gcd(int a,int b)
    {
        return b>0 ? gcd(b,a%b):a;
    }
    int a[N]={6,2,5,5,4,5,6,3,7,6};
    int main()
    {
        ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
        int n,ans=0;
        cin>>n;
        for(int i=10;i<100000;i++){
            int p=i;
            while(p>9){
                int m=p%10;
                a[i]+=a[m];
                p/=10;
            }
            a[i]+=a[p];
        }
        for(int i=0;i<1000;i++){
            for(int j=i;j<1000;j++){
                int tt=n;
                tt-=4+a[i]+a[j]+a[i+j];
                //if(i==71&&j==71) cout<<tt<<endl;
                if(tt>=2) {
                    //cout<<i<<"+"<<j<<"=="<<i+j<<endl;
                    if(i!=j) ans+=2;
                    ans+=2;
                }else if(tt>=0){ 
                    //cout<<i<<"+"<<j<<"="<<i+j<<endl;
                    if(i!=j) ans++;
                    ans++;
                }
            }
        }
        if(ans>0)cout<<ans;
        else cout<<-1;
        return 0;
    }
    
    
    

    Information

    ID
    6638
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    7
    Tags
    (None)
    # Submissions
    57
    Accepted
    12
    Uploaded By