According to Bartjens UVA - 817
2017-08-12 18:35
357 查看
题目传送门
题意:输入一个以等号结尾。前面只包含数字的表达式,插入一些加号、减号和乘号,使得运算结果等于2000.表达式里的整数不能有前导零(例如,0100和000都是非法的),运算符都是二元的(例如,2*-100*-10+0=是非法的),并且符合通常的运算优先级法则。输入数字个数不超过9。如果有多解任意顺序输出:如果无解,输出IMPOSSIBLE。例如,2100100=有3组解,按照字典序依次为2*100*10+0=、2*100*10-0=和2100-100=。
思路:枚举所有的情况,去除掉非法的情况然后进行计算就可以了。要注意一定要往里面插入符号所以2000=应该是输出IMPOSSIBLE,但是如果是02000=就可以输出0+2000=(一直错在这个地方)。
题意:输入一个以等号结尾。前面只包含数字的表达式,插入一些加号、减号和乘号,使得运算结果等于2000.表达式里的整数不能有前导零(例如,0100和000都是非法的),运算符都是二元的(例如,2*-100*-10+0=是非法的),并且符合通常的运算优先级法则。输入数字个数不超过9。如果有多解任意顺序输出:如果无解,输出IMPOSSIBLE。例如,2100100=有3组解,按照字典序依次为2*100*10+0=、2*100*10-0=和2100-100=。
思路:枚举所有的情况,去除掉非法的情况然后进行计算就可以了。要注意一定要往里面插入符号所以2000=应该是输出IMPOSSIBLE,但是如果是02000=就可以输出0+2000=(一直错在这个地方)。
#include <algorithm> #include <cmath> #include <cstdio> #include <cstring> #include <fstream> #include <iostream> #include <list> #include <map> #include <queue> #include <set> #include <sstream> #include <stack> #include <string> #include <vector> #define MAXN 1010 #define MAXE 210 #define INF 10000000 #define MOD 1000000007 #define LL long long #define pi acos(-1.0) using namespace std; int len; vector<string> vec; set<string> Set; string str; string op = "*+-"; void dfs(int cur, string temp) { if (cur == len - 1) { vec.push_back(temp); return; } if (temp[temp.length() - 1] == '0') { if (temp.length() >= 2 && isdigit(temp[temp.length() - 2])) { dfs(cur + 1, temp + str[cur + 1]); } for (int i = 0; i < 3; ++i) { dfs(cur + 1, temp + op[i] + str[cur + 1]); } } else { for (int i = 0; i < 3; ++i) { dfs(cur + 1, temp + op[i] + str[cur + 1]); } dfs(cur + 1, temp + str[cur + 1]); } } void calculate(string temp) { vector<LL> Num, Sign; for (int i = 0; i < temp.size(); ++i) { LL ans = 0; while (i < temp.length() && isdigit(temp[i])) { ans = ans * 10 + temp[i] - '0'; i++; } Num.push_back(ans); if (i == temp.length()) break; Sign.push_back(temp[i]); } for (int i = 0; i < Sign.size(); i++) if (Sign[i] == '*') { Num[i + 1] *= Num[i]; Num.erase(Num.begin() + i); Sign.erase(Sign.begin() + i); i--; } LL sum = Num[0]; for (int i = 0; i < Sign.size(); i++) if (Sign[i] == '+') sum += Num[i + 1]; else sum -= Num[i + 1]; if (sum == 2000) { Set.insert(temp); } } int main() { std::ios::sync_with_stdio(false); int kase = 0; while (cin >> str && str != "=") { vec.clear(); Set.clear(); LL ans = 0; for (int i = 0; i < str.length() - 1; ++i) { ans = ans * 10 + str[i] - '0'; } len = (int)str.length() - 1; str = str.substr(0, len); cout << "Problem " << ++kase << endl; if (str == "2000") { cout << " IMPOSSIBLE\n"; } else { string temp = "\0"; temp += str[0]; dfs(0, temp); for (int i = 0; i < vec.size(); ++i) { calculate(vec[i]); } if (Set.size()) { for (set<string>::iterator it = Set.begin(); it != Set.end(); ++it) { cout << " "; cout << *it << "=\n"; } } else { cout << " IMPOSSIBLE\n"; } } } return 0; } /* 2100100= 77= = */
相关文章推荐
- UVa 817 According to Bartjens (暴力,DFS)
- UVA 817 - According to Bartjens(暴力搜索)
- uva 817 - According to Bartjens(暴力)
- UVA - 817 According to Bartjens
- uva 817 According to Bartjens
- UVA - 817 According to Bartjens
- According to Bartjens UVA - 817
- UVA - 817 According to Bartjens 暴力
- UVa 817:According to Bartjens(DFS)
- UVa 817 - According to Bartjens(暴力)
- According to TLD or attribute directive in tag file, attribute value does not accept any expressions
- org.apache.jasper.JasperException: xxxx.jsp(118,24) Attribute style invalid for tag formatNumber according to TLD
- vim add some characters according to lines
- UVA 10739 String to Palindrome(dp)
- According to TLD or attribute directive in tag file, attribute test does not accept any expressions
- UVa 11175:From D to E and back(图论)
- According to TLD or attribute directive in tag file, attribute value does not accept any expressions
- UVa 10071 Back to High School Physics (water ver.)
- According to TLD or attribute directive in tag file, attribute var does not accept any expressions
- Please change caller according to com.intellij.openapi.project.IndexNotReadyException documentation