-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathuva-10400.cpp
More file actions
99 lines (78 loc) · 2.71 KB
/
uva-10400.cpp
File metadata and controls
99 lines (78 loc) · 2.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
//uva 10400
//Game Show Math
#include <iostream>
#include <climits>
#include <vector>
#include <stack>
using namespace std;
int main(void)
{
int T = 0;
cin >> T;
while (T--) {
int n, target;
cin >> n;
vector <int> num(n);
for (int i = 0; i < n; ++i)
cin >> num[i];
cin >> target;
vector < vector <bool> > arr(n, vector <bool> (64001, 0));
arr[0][num[0] + 32000] = 1;
for (int i = 1; i < n; ++i)
for (int j = 0; j < 64001; ++j)
if (arr[i - 1][j]){
int n_value = j + num[i];
if (n_value >= 0 && n_value < 64001)
arr[i][n_value] = 1;
n_value = j - num[i];
if (n_value >= 0 && n_value < 64001)
arr[i][n_value] = 1;
n_value = (j - 32000) * num[i] + 32000;
if (n_value >= 0 && n_value < 64001)
arr[i][n_value] = 1;
n_value = ((j - 32000) % num[i] == 0 ? (j - 32000) / num[i] + 32000 : INT_MIN);
if (n_value >= 0 && n_value < 64001)
arr[i][n_value] = 1;
}
if (target + 32000 >= 0 && target + 32000 < 64001 && arr[n - 1][target + 32000]){
stack <char> Stack;
int start = target + 32000;
for (int i = n - 1; i > 0; --i){
int val = start - num[i];
if (val >= 0 && val < 64001 && arr[i - 1][val]){
start = val;
Stack.push('+');
continue;
}
val = start + num[i];
if (val >= 0 && val < 64001 && arr[i - 1][val]){
start = val;
Stack.push('-');
continue;
}
val = (start - 32000) % num[i] == 0 ? ((start - 32000) / num[i] + 32000) : INT_MIN;
if (val >= 0 && val < 64001 && arr[i - 1][val]){
start = val;
Stack.push('*');
continue;
}
val = (start - 32000) * num[i] + 32000;
if (val >= 0 && val < 64001 && arr[i - 1][val]){
start = val;
Stack.push('/');
continue;
}
}
cout << num[0];
for (int i = 1; i < n; ++i){
char op = Stack.top();
Stack.pop();
cout << op << num[i];
}
cout << '=' << target << endl;
}
else
cout << "NO EXPRESSION" << endl;
}
return 0;
}