现在的位置: 首页 > 综合 > 正文

poj3983

2014年02月03日 ⁄ 综合 ⁄ 共 1556字 ⁄ 字号 评论关闭

样例过了,这题就A了,像这样

#include<cstdio>
int main() {
   printf("5*(5-(1/5))\n");
}

我的正解是枚举,加括号的方式有5种
(a b) (c d)
((a b) c) d
(a (b c)) d
a (b (c d))
a ((b c) d)
然后三个位置上的符号分别都进行枚举

#include<cstdio>
#include<cmath>
#define MIN 1e-10
double a, b, c, d;

double cal(double n1, double n2, int op) {
   switch(op) {
   case 0:
      return n1+n2;
   case 1:
      return n1-n2;
   case 2:
      return n1*n2;
   case 3:
      return n1/n2;
   }
}

double mode(int m, int op1, int op2, int op3) {
   if(m == 0) {
      return cal(cal(a, b, op1), cal(c, d, op3), op2);
   } else if(m == 1) {
      return cal(cal(cal(a, b, op1), c, op2), d, op3);
   } else if(m == 2) {
      return cal(cal(a, cal(b, c, op2), op1), d, op3);
   } else if(m == 3) {
      return cal(a, cal(b, cal(c, d, op3), op2), op1);
   } else {
      return cal(a, cal(cal(b, c, op2), d, op3), op1);
   }
}

char ch(int op) {
   if(op == 0) {
      return '+';
   } else if(op == 1) {
      return '-';
   } else if(op == 2) {
      return '*';
   } else {
      return '/';
   }
}

void print(int cnt, int op1, int op2, int op3) {
   switch(cnt) {
   case 0:
      printf("(%.0lf%c%.0lf)%c(%.0lf%c%.0lf)\n", a, ch(op1), b, ch(op2), c, ch(op3), d);
      break;
   case 1:
      printf("((%.0lf%c%.0lf)%c%.0lf)%c%.0lf\n", a, ch(op1), b, ch(op2), c, ch(op3), d);
      break;
   case 2:
      printf("(%.0lf%c(%.0lf%c%.0lf))%c%.0lf\n", a, ch(op1), b, ch(op2), c, ch(op3), d);
      break;
   case 3:
      printf("%.0lf%c(%.0lf%c(%.0lf%c%.0lf))\n", a, ch(op1), b, ch(op2), c, ch(op3), d);
      break;
   case 4:
      printf("%.0lf%c((%.0lf%c%.0lf)%c%.0lf)\n", a, ch(op1), b, ch(op2), c, ch(op3), d);
   }
}

int main() {
   while(scanf("%lf%lf%lf%lf", &a, &b, &c, &d) != EOF) {
      bool notfind = true;
      int cnt, op1, op2, op3;
      for(cnt = 0; cnt < 5 && notfind; ++ cnt) {
         for(op1 = 0; op1 < 4 && notfind; ++ op1) {
            for(op2 = 0; op2 < 4 && notfind; ++ op2) {
               for(op3 = 0; op3 < 4 && notfind; ++ op3) {
                  if(fabs(mode(cnt, op1, op2, op3) - 24) < MIN) {
                     notfind = false;
                     print(cnt, op1, op2, op3);
                  }
               }
            }
         }
      }
   }
   return 0;
}

抱歉!评论已关闭.