1 solutions

  • 0
    @ 2021-10-26 10:43:21

    这是一道暴力题,其实很简单只要把所有情况找出来就可以。 但是看了你们的提交,我发现我的数据出水了,让部分人捡漏了。 题库里的数据已经更新了,建议先再做一遍,看看比赛的代码还能不能ac。

    思路: 扑克牌的大小区间是【1,13】,取三个数、两个运算符。 对于除号:要想得到24点,绝对不可能出现两个除号(/)的情况,所以只有ab/c的这种情况(如果ab=24了,且c=1,那我们可以直接用abc来代替ab/c)。这里要注意数据类型,如果三个数都是int类型,对于(1111/5)的运算是可以得到24的,但是在实际运算中,这样算就是错的。(所以数据没出好,给你们捡漏了)。而如果都是double类型,就不会出现这种情况。 对于乘号:情况就比较多了,可以两个先加减再乘,也可以先乘再加减,也可以两个都是乘号。这里要注意如果是两个数先减,要取绝对值abs()。 对于加号和乘号,没什么好说的,没有两个减号,但可以有两个加号。

    #include<bits/stdc++.h>
    using namespace std;
    
    int main(){
        double a,b,c;
        int n;
        cin>>n;
        for(int i = 0;i<n;i++){
            cin>>a>>b>>c;
            if(a+b+c==24) printf("YES\n");
            else if(a*b*c==24) printf("YES\n");
    
            else if(a+(b*c)==24) printf("YES\n");
            else if(b+(a*c)==24) printf("YES\n");
            else if(c+(b*a)==24) printf("YES\n");
    
            else if((b*c)-a==24) printf("YES\n");
            else if((a*c)-b==24) printf("YES\n");
            else if((b*a)-c==24) printf("YES\n");
    
            else if(b+c-a==24) printf("YES\n");
            else if(a+c-b==24) printf("YES\n");
            else if(b+a-c==24) printf("YES\n");
    
            else if(a*(b+c)==24) printf("YES\n");
            else if(b*(a+c)==24) printf("YES\n");
            else if(c*(b+a)==24) printf("YES\n");
    
            else if(a*b/c==24) printf("YES\n");
            else if(a*c/b==24) printf("YES\n");
            else if(b*c/a==24) printf("YES\n");
    
            else if(abs(b-c)*a==24) printf("YES\n");
            else if(abs(a-c)*b==24) printf("YES\n");
            else if(abs(b-a)*c==24) printf("YES\n");
    
            else cout<<"NO"<<endl;
    
        }
        return 0;
    }
    

    Information

    ID
    135
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    9
    Tags
    # Submissions
    181
    Accepted
    15
    Uploaded By