1 条题解
-
1
#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
- 上传者