题目传送门
一道贪心题……
贪心策略是除了最后一个 #
其他的都变成 1 个 )
,这样前面的 )
就尽可能的少,最后的 #
变成的 )
数量加上前面的 )
数量等于 (
的数量,这样在最后所有的括号都会匹配。最后检查一下合不合法。
Code
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
| #include <bits/stdc++.h> #define ll long long #define INF 1e9 using namespace std; string s, tmp; int sum1, sum2, sum3, sum4, cnt, last; signed main() { ios :: sync_with_stdio(0); cin >> s; if (s.size() == 1) { cout << -1; return 0; } for (int i = s.size() - 1; i >= 0; i--) { if (s[i] == '#') { cnt++; last = i; break; } } for (int i = 0; i < s.size(); i++) { if (i == last) continue; if (s[i] == '(') sum1++; else if (s[i] == ')') sum2++; else { cnt++; s[i] = ')'; sum2++; } } if (sum1 == sum2) { cout << -1; return 0; } for (int i = 1; i <= sum1 - sum2; i++) tmp += ')'; s.replace(last, 1, tmp); for (int i = 0; i < s.size(); i++) { if (s[i] == '(') sum3++; if (s[i] == ')') sum4++; if (sum4 > sum3) { cout << "-1"; return 0; } } for (int i = 1; i <= cnt; i++) { if (i == cnt) cout << sum1 - sum2; else cout << 1 << "\n"; } return 0; }
|