1 条题解

  • 1
    @ 2022-8-31 9:26:55
    #include <bits/stdc++.h>
    #define eps 1e-7 //因为实数计算会有误差,但误差范围应该是小于10^-7的。 
    using namespace std ;
    int x[10010] ;//答案,判重 
    int h,ans ;
    int r[10],a[10] ;
    double habs(double x){ //好像abs被占用了,忘记那个abs怎么打的了,手打算了。 
    	return x<0?-x:x ;
    }
    inline void add(int a1,int a2,int a3,int a4,int a5,int a6,int a7){ //后缀表达式形式 
        x[++h]=(a1|a2<<3|a3<<6|a4<<9|a5<<12|a6<<15|a7<<18); 
    	//因为他说a,b,c,d最大是100,100是三位,那就让一个数上占用三个位置 
    }
    double calc(double x,double y,int f) //f表示符号(+-*/),相当于 a (f) b 
    {
    	if (f==0) return x+y ;
    	else if (f==1) return x-y ;
    	else if (f==2) return x*y ;
    	else return x/y ;
    } 
    inline bool find(int a,int b){
        if (a==0) return b>1;
        if (a==2) return b<2;
        return 1;
    }
    void check(int a1,int a2,int a3,int a4)
    {
    	for (int i=0;i<=3;i++)
    	for (int j=0;j<=3;j++)
    	for (int k=0;k<=3;k++)
    	{
    		bool f1=find(k,j),f2=find(j,i);
    		//一下是5种加括号方式 
        	if (habs( calc ( calc ( calc (a[a1],a[a2],i) ,a[a3],j) ,a[a4],k) -24)<eps) 
            	add(r[a1],r[a2],i+4,r[a3],j+4,r[a4],k+4);//表示(1,2,3,4) 
            	
            if (f1 && habs(calc ( calc (a[a1],a[a2],i), calc (a[a3],a[a4],j),k)-24)<eps) 
            	add(r[a1],r[a2],i+4,r[a3],r[a4],j+4,k+4);//表示((1,2),(3,4)) 
            	
            if (f1 && habs( calc (a[a1], calc ( calc (a[a2],a[a3],i),a[a4],j),k)-24)<eps) 
            	add(r[a1],r[a2],r[a3],i+4,r[a4],j+4,k+4);//表示(1,(2,3,4)) 
    				
            if (f2 && habs( calc ( calc (a[a1], calc (a[a2],a[a3],i),j),a[a4],k)-24)<eps) 
            	add(r[a1],r[a2],r[a3],i+4,j+4,r[a4],k+4);//表示((1,(2,3)),4) 
            
            if (f1 && f2 && habs( calc (a[a1], calc (a[a2], calc (a[a3],a[a4],i),j),k)-24)<eps) 
           	 	add(r[a1],r[a2],r[a3],r[a4],i+4,j+4,k+4);//表示(1,(2,(3,4)))
    	}
    }
    int main()
    {
    	for (int i=0;i<=3;i++) scanf("%d",&a[i]) ;
    	for (int i=0;i<=3;i++)
    	for (int j=0;j<=3;j++)
    	if (a[i]<a[j]) r[i]++ ;//r数组表示第i个数是第几大的(最大的标号是0)。
    	for (int i=0;i<=3;i++) 
    	for (int j=0;j<=3;j++)
    	for (int k=0;k<=3;k++)
    	for (int l=0;l<=3;l++)
    	if (i!=j && i!=k && i!=l && j!=k && j!=l && k!=l) //写的有点冗(Rong)余,但是肯定对的 
    	check(i,j,k,l) ; 
    	sort(x+1,x+h+1) ;
    	if (h) ans=1 ;//如果有值,那ans=1,之后的再判重 
    	for (int i=2;i<=h;i++) if (x[i]!=x[i-1]) ans++ ;
    	printf("%d",ans) ;
    } 
    
    • 1

    信息

    ID
    1229
    时间
    1000ms
    内存
    125MiB
    难度
    4
    标签
    递交数
    2
    已通过
    2
    上传者