標籤:
Topcoder SRM 688 div2
250:
#include <vector>#include <list>#include <map>#include <set>#include <deque>#include <stack>#include <bitset>#include <algorithm>#include <functional>#include <numeric>#include <utility>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <ctime>using namespace std;class ParenthesesDiv2Easy {public: int getDepth(string);};int ParenthesesDiv2Easy::getDepth(string s) { int n = s.size(); if(n == 0) return 0; int cnt = 0; int pre = 0; int res = 0; for(int i = 0 ; i < n ; i++) { if(s[i] == ‘)‘) cnt--; else if(s[i] == ‘(‘) cnt++; if(cnt == 0) { res = max(res, getDepth(s.substr(pre + 1, i - pre - 1)) + 1); pre = i + 1; } } return res;}<%:testing-code%>//Powered by [KawigiEdit] 2.0!
500:
/*
想了一陣
首先把合法的括弧都排除掉
然後剩下的都是不合法的括弧
首先採用貪心的變法,遇到只有)沒有(與它對應的時候,把)變成(變換後的就是合法情況,或者左括弧多的情況左括弧多的情況,則從後往前變(為),直到總情況合法分類討論後發現,總的操作次數是滿足題意的。
*/
#include <vector>#include <list>#include <map>#include <set>#include <deque>#include <stack>#include <bitset>#include <algorithm>#include <functional>#include <numeric>#include <utility>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <ctime>using namespace std;class ParenthesesDiv2Medium {public: vector <int> correct(string);};vector <int> ParenthesesDiv2Medium::correct(string s) { int n = s.size(); int vis[100]; for(int i = 0 ; i < n ; i++) vis[i] = 0; stack<int>sta; vector<int> res; for(int i = 0 ; i < n ; i++) { if(s[i] == ‘(‘) sta.push(i);//, printf("i = %d, first\n", i); else if(s[i] == ‘)‘ && !sta.empty()) { int u = i, v = sta.top(); sta.pop();// printf("u = %d,v = %d\n", u,v); vis[u] = 1, vis[v] = 1;// printf("i = %d, second\n", i); } } vector<int>tres; for(int i = 0 ; i < n ; i++) { if(vis[i] == 0) tres.push_back(i); } int cnt = 0; for(int i = 0 ; i <(int)tres.size(); i ++) { // printf("tres[%d] = %d\n", i, tres[i]); if(s[tres[i]] == ‘(‘) cnt++; else cnt--; if(cnt < 0) vis[tres[i]] = 1, cnt += 2, res.push_back(tres[i]); } if(cnt < 0) { for(int i = 0 ; i < n ; i++) { if(vis[i] == 0 && s[i] == ‘)‘) vis[i] = 1, cnt += 2, res.push_back(i); if(cnt >= 0) break; } } if(cnt > 0) { for(int i = n - 1 ; i >= 0 ; i--) { if(vis[i] == 0 && s[i] == ‘(‘) vis[i] = 1, cnt -= 2, res.push_back(i); if(cnt <= 0) break; } } sort(res.begin(), res.end()); //for(int i = 0 ; i < (int)res.size() ; i++) printf("%d ", res[i]); //puts(""); return res;}<%:testing-code%>//Powered by [KawigiEdit] 2.0!
1000:
/*
把所有字串按照L和R分成無數個子串,剩下未分入任何子串的字元做一個統計預備替換子串中元素用
那麼,每個子串可有兩個數字sum1,sum2分別表示左括弧不合法和右括弧不合法的個數
注意每次替換子串中一個元素,比如(,那麼sum1-=2所以子串應該替換比如(直到sum1<=2,此時若sum1為1的話,可證此時sum2也為1,表示還剩下一對不合法的(和),只要交換他們兩個就可以
*/
#include <vector>#include <list>#include <map>#include <set>#include <deque>#include <stack>#include <bitset>#include <algorithm>#include <functional>#include <numeric>#include <utility>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <ctime>using namespace std;class ParenthesesDiv2Hard {public: int minSwaps(string, vector <int>, vector <int>);};const int MAXN = 100 + 5;int sum1[MAXN], sum2[MAXN], vis[MAXN];int ParenthesesDiv2Hard::minSwaps(string s, vector <int> L, vector <int> R) { int n = s.size(), m = L.size(); for(int i = 0 ; i <= n ; i++) vis[i] = 0; for(int i = 0 ; i < m ; i++) if((R[i] - L[i]) % 2 == 0) return -1; for(int i = 0 ; i < m ; i++) { int cnt = 0; sum1[i] = sum2[i] = 0; for(int j = L[i] ; j <= R[i] ; j++) { if(s[j] == ‘(‘) cnt++; else cnt--; if(cnt < 0) cnt++, sum2[i]++; vis[j] = 1; } sum1[i] = max(0, cnt); } int c1, c2; c1 = c2 = 0; for(int i = 0 ; i < n ; i++) { if(vis[i] == 1) continue; if(s[i] == ‘(‘) c1++; else c2++; } int s1, s2; s1 = s2 = 0; int res = 0; for(int i = 0 ; i < n ; i++) { s1 += sum1[i] / 2; s2 += sum2[i] / 2; if(sum1[i] % 2) res++; } // printf("s1 = %d, s2 = %d, c1 = %d, c2 = %d\n", s1, s2, c1, c2); if(s1 > s2 && s1 > s2 + c2) return -1; else if(s2 > s1 && s2 > s1 + c1) return -1; else return res + max(s1, s2);}<%:testing-code%>//Powered by [KawigiEdit] 2.0!
Topcoder SRM 688 div2