-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathP11059.cpp
70 lines (66 loc) · 1.54 KB
/
P11059.cpp
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
#include <iostream>
typedef long long ll;
void updateMax(ll &max, const ll allProd, const ll afn, const ll bln, const bool evenNegs) {
//std::cerr << "Updating max: max=" << max << ", allProd=" << allProd << ", afn=" << afn << ", bln=" << bln << ", evenNegs=" << evenNegs << std::endl;
if(evenNegs) {
if(allProd > max)
max = allProd;
return;
}
// Uneven negs: Max is either allProd/bfn or allProd/aln
if(afn > max)
max = afn;
if(bln > max)
max = bln;
}
int main() {
int N, a;
for(int cas = 1; std::cin >> N; ++cas) {
ll max = 0;
ll allProd = 0;
ll afterFirstNeg = 0;
ll beforeLastNeg = 0;
bool evenNegs = true;
bool anyNegs = false;
for(int i = 0; i < N; ++i) {
std::cin >> a;
if(a == 0) {
updateMax(max, allProd, afterFirstNeg, beforeLastNeg, evenNegs);
allProd = 0;
afterFirstNeg = 0;
beforeLastNeg = 0;
anyNegs = false;
evenNegs = true;
}
else if(a > 0) {
if(allProd == 0)
allProd = a;
else
allProd *= a;
if(anyNegs) {
if(afterFirstNeg == 0)
afterFirstNeg = a;
else
afterFirstNeg *= a;
}
}
else { // a < 0:
beforeLastNeg = allProd;
if(allProd == 0)
allProd = -a;
else
allProd *= -a;
if(anyNegs) {
if(afterFirstNeg == 0)
afterFirstNeg = -a;
else
afterFirstNeg *= -a;
}
evenNegs = !evenNegs;
anyNegs = true;
}
}
updateMax(max, allProd, afterFirstNeg, beforeLastNeg, evenNegs);
std::cout << "Case #" << cas << ": The maximum product is " << max << "." << std::endl << std::endl;
}
}