2016微软探星夏令营:#1341 : Constraint Checker

来源:互联网 发布:虚拟机ubuntu怎样重置 编辑:程序博客网 时间:2024/04/30 08:31

这一题思路比较简单,主要是字符串处理比较繁琐,源代码如下:

#include <iostream>#include <vector>#include <string>#include <unordered_set>#include <unordered_map>using namespace std;int main(void){int n, m;string str;vector<vector<string> > constraints;unordered_set<char> charMap;cin >> n;for(int i = 0; i < n; ++i){cin >> str;size_t pos = 0;vector<string> cons;while((pos = str.find("<=", pos)) != string::npos){str = str.replace(pos, 2, "^");}for(size_t i = 0; i < str.size();){string tmp = "";if(str[i] >= 'A' && str[i] <= 'Z'){charMap.insert(str[i]);tmp += str[i++];}else if(str[i] == '<' || str[i] == '^'){tmp += str[i++];}else{while(i < str.size() && str[i] >= '0' && str[i] <= '9')tmp += str[i++];}cons.emplace_back(tmp);}constraints.emplace_back(cons);}//checkcin >> m;for(int k = 0; k < m; ++k){int val;string key;unordered_map<string, int> valueTable;for(size_t i = 0; i < charMap.size(); ++i){cin >> key >> val;valueTable[key] = val;}bool isYes = true;for(size_t i = 0; i < constraints.size() && isYes; ++i){vector<string> &cons = constraints[i];for(size_t j = 0; j < cons.size() - 2 && isYes; j += 2){int a = (cons[j] >= "A" && cons[j] <= "Z") ? valueTable[cons[j]] : atoi(cons[j].c_str());int b = (cons[j+2] >= "A" && cons[j+2] <= "Z") ? valueTable[cons[j+2]] : atoi(cons[j+2].c_str());isYes = (cons[j+1] == "<") ? (a < b) : (a <= b); }}cout << (isYes ? "Yes" : "No") << endl;}return 0;}

另外,本题有点儿类似于表达式求值,用栈也可以求解,感兴趣的朋友可以自己试一下。

上述代码已经AC,能力有限,纰漏之处欢迎大家批评指正!

0 0
原创粉丝点击