HDU-4192 Guess the Numbers 表达式求值

给出n个数字,能不能通过所给表达式计算得到m。比较水的题,可能代码写起来比较麻烦。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int ss[26];
char s[1111];
int d[10];
int n, m;
int u = 0;
int cul() {
    int r = 0, p, p1, p2;
    if(s[u] == '(') {
        u++;
        r = cul();
    }
    else {
        p = ss[s[u] - 'a'];
        r = d[p];
        u++;
    }
    for(;s[u];) {
        if(s[u] == ')') {
            u++;
            return r;
        }
        int t;
        char ch = s[u];
        u++;
        if(s[u] == '(') {
            u++;
            t = cul();
        }
        else {
            p = ss[s[u] - 'a'];
            t = d[p];
            u++;
        }
        if(ch == '*')
            r *= t;
        if(ch == '+')
            r += t;
        if(ch == '-')
            r -= t;
    }
    return r;
}
int deal() {
    int is = 0;
    memset(ss, -1, sizeof(ss));
    for(int i = 0; s[i]; i++) {
        if(islower(s[i]) && ss[s[i] - 'a'] == -1)
            ss[s[i] - 'a'] = is++;
    }
    do {
        u = 0;
        if(cul() == m)
            return 1;
    }while(next_permutation(d, d + n));
    return 0;
}
int main() {
    int i, j;
    while(~scanf("%d", &n)) {
        for(i = 0; i < n; i++)
            scanf("%d", &d[i]);
        scanf("%d", &m);
        if(!n && !m)
            break;
        scanf("%s", s);
        sort(d, d + n);
        if(deal())
            printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值