64 条题解

  • 0
    @ 2023-10-19 21:08:32

    对于一个递归函数 w(a,b,c)

    • 如果 a <= 0 或 b <=0 或 c <= 0就返回值1。
    • 如果 a>10 或 b>10 或 c>10 就返回 w(10,10,10)
    • 如果 a<b 并且 b<c就返回w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c)
    • 其它的情况就返回 w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1)

    注意:例如 w(30,-1,0) 又满足条件 1 又满足条件 2,请按照最上面的条件来算,答案为 1。 代码就按题目说的写,因为按最上面的条件来算,所以要按顺序写,最重要的是,要开long long, 不能太贪心的开unsigned long long,因为这是无符号,只有90,第二个测试点是负数,所以负数会变成非常大。 废话说了那么多,下面上代码:

    #include <bits/stdc++.h>
    #define ll long long
    using namespace std;
    ll a,b,c;
    ll w(ll a,ll b,ll c)
    {
        if (a <= 0 || b <= 0 || c <= 0)
        {
            return 1;
        }
        else if (a > 10 || b > 10 || c > 10)
        {
            return w(10,10,10);
        }
        else if (a < b && b < c)
        {
            return w(a,b,c - 1) + w(a,b - 1,c - 1) - w(a,b - 1,c);
        }
        else
        {
            return w(a - 1,b,c) + w(a - 1,b - 1,c) + w(a - 1,b,c - 1) - w(a - 1,b - 1,c - 1);
        }
    }
    signed main()
    {
        cin >> a >> b >> c;
        cout << "w(" << a << "," << b << "," << c << ")=" << w(a,b,c);
        return 0;
    }
    

    信息

    ID
    7
    时间
    2000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    9573
    已通过
    2181
    上传者