Topcoder SRM 688 div2

來源:互聯網
上載者:User

標籤:

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.