CSP201903 T2 二十四点 论STL的正确应用

文章来自  Icontofig 's Blog // 我们的征程是星辰大海!Away From OI,Come to ICPC(查看友链请点About Me)

题解

这道题如果会C++ STL的话会方便许多,当然也可以手写,不过可能要麻烦一点点。

首先考虑运算符的运算顺序,肯定是x和/先进行运算了。

那么我们就先将+和-操作丢进双端队列里面,等待最后运算。

然后我们还要设置一个保存数字的双端队列,且要保证此队列任何时候都有数字。

这样当我们遇到x和/的时候,就把队尾元素取出和下一个数字进行运算,然后再压入队尾。

最后处理+和-操作就可以了。

代码

#include <bits/stdc++.h>
using namespace std;
int n;
string s;
deque<int>x;
deque<char>y;
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    for(int i = 1;i <= n;++i){
        cin >> s;
        while(!x.empty())x.pop_back();
        while(!y.empty())y.pop_back();
        x.push_back(s[0] - '0');
        for(int j = 1;j < 7;j += 2){
            if(s[j] == 'x' || s[j] == '/'){
                int now = x.back();
                x.pop_back();
                if(s[j] == 'x'){
                    now *= (s[j+1] - '0');
                    x.push_back(now);
                }
                else{
                    now /= (s[j+1] - '0');
                    x.push_back(now);
                }
            }
            else{
                y.push_back(s[j]);
                x.push_back(s[j+1] - '0');
            }
        }
        int cnt = 0;
        while(!y.empty()){
            char ch = y.front();
            y.pop_front();
            int x1 = x.front();
            x.pop_front();
            int x2 = x.front();
            x.pop_front();
            if(ch == '+'){
                x.push_front(x1+x2);
            }
            else x.push_front(x1-x2);
        }
        cnt = x.front();
        x.pop_front();
        if(cnt == 24)cout << "Yes" << endl;
        else cout << "No" << endl;
    }
    return 0;
}


Sign in to leave a comment.
No Leanote account ? Sign up now.
0 comments
Title - Artist
0:00