2018 Multi-University Training Contest 1 Balanced Sequence(贪心)
生活随笔
收集整理的這篇文章主要介紹了
2018 Multi-University Training Contest 1 Balanced Sequence(贪心)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
t組測試數據,每組數據有 n 個只由 '('?和?')' 構成的括號串。
要求把這 n 個串排序然后組成一個大的括號串,使得能夠匹配的括號數最多。
如()()答案能夠匹配的括號數是 4,(()) 也是 4。
例如:
n = 2
)
)((
你可以將其排序為))((,數目為0,也可以將其排序為)((),數目為1。
?
?
解法:
貪心。
把所有字符串中本身能夠匹配的括號全部去掉,然后剩下的字符串只有三種:
1、全是 '('
2、全是 ')'
3、一串 ')' 加一串 '('
對于每一種字符串,如果 '(' 的數目多于 ‘)’,就把它放在前面,按照字符串中的 ‘)’ 從小到大排序。
如果?')' 的數目多于 ‘(’,就把它放在后面,按照字符串中的 ‘(’ 從大到小排序。
然后統計新串合法的括號數即可。
?
?
#include <iostream> #include <cstdlib> #include <cstdio> #include <cmath> #include <algorithm> using namespace std;#define maxn 100000 + 1000struct Node {int x, y; }a[maxn];bool cmp(Node a, Node b) {if (a.x-a.y >= 0 && b.x-b.y < 0) return true; if (a.x-a.y < 0 && b.x-b.y >= 0) return false; // 左括號數目>右括號數目的,一定在右括號>左括號的前面 if (a.x-a.y >= 0 && b.x-b.y >= 0) return a.y < b.y; //都是左括號比有括號多,按照右括號的數量從小到大排序if (a.x-a.y < 0 && b.x-b.y < 0) return a.x > b.x; //都是左括號比右括號少,按照左括號的數量從大到小排序 }int main() {int t;scanf("%d", &t);for (int ca = 1; ca <= t; ca++){int n, ans = 0;scanf("%d", &n);for (int i = 1; i <= n; i++){char s[maxn];scanf("%s", s);a[i].x = a[i].y = 0; //a[i].x 記錄左括號的數量, a[i].y 記錄右括號的數量。for (int j = 0; s[j] != '\0'; j++)if (s[j] == ')'){if (a[i].x) {a[i].x--; ans++;}else a[i].y++;}else a[i].x++;//括號匹配}sort(a+1, a+1+n, cmp);int instack = 0;for (int i = 1; i <= n; i++){if (a[i].y && instack){ans += min(a[i].y, instack);instack = max(0, instack-a[i].y);}instack += a[i].x;}
//最后進行一次括號匹配,繼續統計答案。printf("%d\n", ans * 2);}}
?
轉載于:https://www.cnblogs.com/ruthank/p/9371156.html
總結
以上是生活随笔為你收集整理的2018 Multi-University Training Contest 1 Balanced Sequence(贪心)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MongoDB系列四(索引).
- 下一篇: 冰雪传奇刷怪计时器_冰雪传奇BOSS计时