题意:

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 + 1000 struct Node
{
int x, y;
}a[maxn]; bool cmp(Node a, Node b)
{
if (a.x-a.y >= && b.x-b.y < ) return true;
if (a.x-a.y < && b.x-b.y >= ) return false;    // 左括号数目>右括号数目的,一定在右括号>左括号的前面
if (a.x-a.y >= && b.x-b.y >= ) return a.y < b.y;    //都是左括号比有括号多,按照右括号的数量从小到大排序
if (a.x-a.y < && b.x-b.y < ) return a.x > b.x;     //都是左括号比右括号少,按照左括号的数量从大到小排序
} int main()
{
int t;
scanf("%d", &t);
for (int ca = ; ca <= t; ca++)
{
int n, ans = ;
scanf("%d", &n);
for (int i = ; i <= n; i++)
{
char s[maxn];
scanf("%s", s);
a[i].x = a[i].y = ; //a[i].x 记录左括号的数量, a[i].y 记录右括号的数量。 for (int j = ; 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+, a++n, cmp); int instack = ;
for (int i = ; i <= n; i++)
{
if (a[i].y && instack)
{
ans += min(a[i].y, instack);
instack = max(, instack-a[i].y);
}
instack += a[i].x;
}
    //最后进行一次括号匹配,继续统计答案。 printf("%d\n", ans * );
} }

最新文章

  1. 你可曾见过如此简单粗暴的JavaScript解说 -- if 判断的正确打开方式?
  2. UIScrollView的缩放原理
  3. MAXIMO-修改菜单
  4. svn更改分支名字,move命令
  5. 鼠标滚动插件smoovejs和wowjs
  6. Java中断言的使用(转)
  7. c#比较器 排序
  8. http://blog.csdn.net/woshiyjk/article/details/7895888
  9. C#- Winform调用BAT例子
  10. Android自定义View——自定义搜索框(SearchView)
  11. network: Android 网络推断(wifi、3G与其它)
  12. JS(三)
  13. Oracle的问题的解决
  14. MHA-Atlas-MySQL高可用集群2
  15. pytesseract在识别只有一个数字的图片时识别不出来
  16. GitHub下载子目录
  17. OCR技术(光学字符识别)
  18. bash: export: “path” not a valid identifier [closed]
  19. linux系统时间不同步解决办法(同步本地时间)
  20. rviz学习笔记(二)——Markers: Points and Lines (C++) 点和线

热门文章

  1. java颜色代码对照表
  2. Ubuntu搭建WordPress-MySQL-Apache
  3. Eclipse启动SDK Manager报错:[SDK Manager] &#39;xcopy&#39; 不是内部或外部命令,也不是可运行的程序。
  4. idea报错:Error running $classname: Command line is too long. Shorten command line for $classname.
  5. scrollHelper
  6. webpack分开打包和合并打包的瘦身
  7. 编译安装php容易出现的问题以及解决办法
  8. 在使用添加按钮给table插入新的一行时遇见的问题总结及处理方法
  9. jquery笔记1--选择器
  10. UI设计中蕴涵着系统重要的数据结构与功能设计