sdnuoj 1193.火柴棒等式

题意:

给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数。
火柴棍数如下
在这里插入图片描述
注意:

  1. 加号与等号各自需要两根火柴棍
  2. 如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C>=0)
  3. n根火柴棍必须全部用上

这个题就是暴力枚举
先把每个数字的火柴棍数写出来

int tr[10] = {
    
    6, 2, 5, 5, 4, 5, 6, 3, 7, 6};

要想满足题意就得满足两个条件
1.A + B = C这个数学等式得成立
2.就是得满足A的火柴棍数 + B的火柴棍数 + C的火柴棍数 = n - 4 (4 是指加好和等号的火柴棍数)

然后就直接写暴力判断,本来我写的是三个循环,就是每个循环一个数ABC,结果时间太长了,等半天也不出结果
后来发现写两个就可以 因为 i + j 就等于第三个数C,所以就把两个判断缩减成一个了,就f(i + j) == n - 4 - f(i) - f(j)(巧妙吧……)

还有一点就是枚举的次数 有点东西,就是你写出来那个火柴棍的个数会发现,7是三个,就有可搞性,比如771 + 1 = 772,共23个,没超,所以这个范围得到800就差不多了,你也不能为了省事无限弄大,万一就超时了呢……

#include<bits/stdc++.h>
using namespace std;

int tr[11] = {
    
    6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
int f(int x)
{
    
    
    int sum = 0;
    if(x < 10)
        return tr[x % 10];
    else
    {
    
    
        while(x)
        {
    
    
            sum += tr[x % 10];
            x = x / 10;
        }
        return sum;
    }
}

int main()
{
    
    

    int n;
    int ans = 0;
    cin>>n;
    n = n - 4;
    for(int i = 0; i <= 800; i++)
    {
    
    
        for(int j = 0; j <= 800; j++)
        {
    
    
            if(f(i + j) == n - f(i) - f(j))
                ans++;

        }
    }
    cout<<ans;



}

猜你喜欢

转载自blog.csdn.net/weixin_51216553/article/details/110307616
今日推荐