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
原创粉丝点击