360 9.14笔试

第二题大模拟真的有点折磨了

第一题

给出m种饮料,每种饮料只有一杯,接下来有n个客人,每个客人有两种想喝的饮料,请问最多能满足多少位客人。
数据范围比较小n = 20,所以直接暴力求解

#include<bits/stdc++.h>  
using namespace std;  
int main() {  
    int n,m;  
    cin >> n >> m;  
    int res = 0;  
    vector<int> ind(m + 1, 0);  
    vector<vector<int>> nums;  
    for (int i = 0; i < n; i++) {  
        int a,b;  
        cin >> a >> b;  
        nums.push_back(vector<int>{a,b});  
    }  
    function<void(int,int)> dfs = [&] (int pox, int now) {  
        if (pox == n) {  
            res = max(res, now);  
            return;  
        }  
        if (ind[nums[pox][0]] == 0 && ind[nums[pox][1]] == 0) {  
            ind[nums[pox][0]] = 1;  
            ind[nums[pox][1]] = 1;  
            dfs(pox + 1, now + 1);  
            ind[nums[pox][0]] = 0;  
            ind[nums[pox][1]] = 0;  
        }  
        dfs(pox + 1, now);  
    };  
    dfs(0, 0);  
    cout << res;  
    return 0;  
}

第二题

给出T个方程,允许在每个方程中添加至多一位数字,询问每个方程是否成立。
给定的方程中只有“+*="和数字三种符号。T至多为10,每个方程的长度至多为1000。
以下解法只通过82% Runtime Error

  1. 枚举对应的插入位置
  2. 根据等号拆分开
  3. 模拟进行表达式的计算
#include <bits/stdc++.h>  
using namespace std;  
int cacu(string s) {  
    int n = s.length();  
    stack<int> st;  
    int pox = 0;  
    int left = 0;  
    while (pox < n) {  
        while (pox < n && s[pox] != '+' && s[pox] != '*') {  
            pox++;  
        }  
        long long tmp = stoi(s.substr(left, pox - left));  
        left = pox + 1;  
        while (pox < n && s[pox] == '*') {  
            pox++;  
            while (pox < n && s[pox] != '+' && s[pox] != '*') {  
                pox++;  
            }  
            int tmp2 = stoi(s.substr(left, pox - left));  
            left = pox + 1;  
            tmp = tmp * tmp2;  
        }  
        st.push(tmp);  
        pox++;  
    }  
    long long res = 0;  
    while (!st.empty()) {  
        res += st.top();  
        st.pop();  
    }  
    return res;  
}  
bool scheck(string s) {  
    int epox = 0;  
    while (s[epox] != '=') {  
        epox++;  
    }  
    string s1 = s.substr(0, epox);  
    string s2 = s.substr(epox + 1);  
    if (cacu(s1) == cacu(s2)) return true;  
    else return false;  
}  
const char chars[]{'0','1','2','3','4','5','6','7','8','9'};  
int main() {  
    int T;  
    cin >> T;  
    for (int p = 0; p < T; p++) {  
        string s;  
        cin >> s;  
        scheck(s);  
        int len = s.length();  
        if (scheck(s)) {  
            cout << "Yes" <<endl;  
            continue;  
        }  
        bool flag = false;  
        for (int i = 0; i < 10 && (!flag); i++) {  
            for (int j = 0; j <= len && (!flag);j++) {  
                string tmp1 = s.substr(0, j);  
                string tmp2 = s.substr(j);  
                string s1 = tmp1 + chars[i] + tmp2;  
                if (scheck(s1)) flag = true;  
            }  
        }  
        if (flag) cout << "Yes" <<endl;  
        else cout << "No" <<endl;  
    }  
    return 0;  
}  
posted @   tanch25  阅读(14)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示