#include #include #include #include #include #include #define INPUT "optimal.in" int num_checks; int inputs[10]; int outputs[10]; int stack_size; int stack[11]; char * nom_ops[5] = { "ADD", "DIV", "DUP", "MUL", "SUB" }; #define OP_ADD 0 #define OP_DIV 1 #define OP_DUP 2 #define OP_MUL 3 #define OP_SUB 4 int num_ops; int ops[11]; int do_op(int op) { int a; switch(op) { case OP_ADD: if (stack_size<2) return 0; a = stack[stack_size-2]+stack[stack_size-1]; if (a>30000 || a<-30000) return 0; stack_size--; stack[stack_size-1]=a; break; case OP_DIV: if (stack_size<2) return 0; if (stack[stack_size-1]==0) { return 0; } a = stack[stack_size-2]/stack[stack_size-1]; if (a>30000 || a<-30000) return 0; stack_size--; stack[stack_size-1]=a; break; case OP_DUP: if (stack_size<1) return 0; stack_size++; stack[stack_size-1]=stack[stack_size-2]; break; case OP_MUL: if (stack_size<2) return 0; a = stack[stack_size-2]*stack[stack_size-1]; if (a>30000 || a<-30000) return 0; stack_size--; stack[stack_size-1]=a; break; case OP_SUB: if (stack_size<2) return 0; a = stack[stack_size-2]-stack[stack_size-1]; if (a>30000 || a<-30000) return 0; stack_size--; stack[stack_size-1]=a; break; } return 1; } int check(void) { int i,j; if (stack_size!=1) { return 0; } if (stack[0]!=outputs[0]) { return 0; } for(i=1; i