CCF CSP 201903-2 二十四点

放肆的年华 提交于 2019-11-27 16:23:09
#include <bits/stdc++.h>
#include <queue>
#include <iostream>
using namespace  std;
int main() {
    int n;
    string s;
    cin >> n;
    queue<int> num;
    queue<char> op;
    while(n--) {
        cin >> s;
        s.push_back('+');
        for(int i = 1; i < s.size(); i+=2) {
            int t = s[i-1] - '0';
            for ( ;i < s.size() && s[i] == 'x' || s[i] == '/'; i += 2) {
                t = (s[i] == 'x') ? t * (s[i+1]-'0'): t / (s[i+1] - '0');
            }
            num.push(t);
            op.push(s[i]);
        }
        num.push(0);
        int ans = num.front();
        num.pop();
        while(!op.empty()) {
            char opration = op.front();
            op.pop();
            ans = (opration == '+') ? ans + num.front() : ans - num.front();
            num.pop();
        }
        cout << (ans == 24 ? "Yes" : "No" )<< endl;
        //cout << ans;
    }
    return 0;
}

这个题目最一般的思路可能是按照数据结构课所学的,用后缀表达式,但是

https://blog.csdn.net/richenyunqi/article/details/89188626提出了这样的思路

先算乘除,把表达式变成只有加减,然后计算加减即可。

(这体现了一种“减而治之”的思想——把大问题化简成小问题,把困难问题化简成简单问题)

具体思路见链接

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!