ZOJ-3196
来源:互联网 发布:黑帽seo技术论坛 编辑:程序博客网 时间:2024/06/11 07:57
本题我直接暴力枚举了所有符号排列,还可以用DFS搜。。注意有几个坑,一是计算结果要用long long,int会溢出,虽然每个数小于100,但所有数相乘就很大了!!!改了之后提交还是WA,只好重新仔细检查,发现不能用abs函数。。因为他接收的是int参数,算绝对值还是直接加个负号省事。。所有BUG改完,终于AC了。。
#include<stdio.h>#include<stdlib.h>long long calculate(long long a, long long b, char op){ if (op == '+') return a + b; else if (op == '-') return a - b > 0 ? a - b : b - a; else if (op == '*') return a * b; else if (b) return a / b; else return -1;}int contain(long long num, int k){ do { if (num % 10 == k) return 1; num /= 10; } while (num); return 0;}int main(){ int t; char op[] = { '+', '-', '*', '/' }; scanf("%d", &t); while (t--) { int i, j, n, k, a[9]; long long max = -1; scanf("%d %d", &n, &k); for (i = 0; i < n; i++) scanf("%d", &a[i]); for (i = 0; i < 1 << (2 * n - 2); i++) { int num = i, div_zero = 0; long long temp, prev = a[0]; for (j = 0; j < n - 1; j++) { temp = calculate(prev, a[j + 1], op[num % 4]); if (temp == -1) { div_zero = 1; break; } else prev = temp; num /= 4; } if (!div_zero && temp > max && !contain(temp, k)) max = temp; } if (max != -1) printf("%lld\n", max); else printf("No result\n"); } return 0;}
0 0