题意:

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 * );
} }

2018 Multi-University Training Contest 1 Balanced Sequence(贪心)的更多相关文章

  1. 2018 Multi-University Training Contest 1-1002 -Balanced Sequence(括号匹配+贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6299 题目: 题意:t组数据,每组数据给你一个n表示给你n个括号串,这n个括号串之间进行组合,求能够匹 ...

  2. 2015 Multi-University Training Contest 1 y sequence

    Y sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  3. hdu6299 Balanced Sequence 贪心

    题目传送门 题目大意:给出n个字符串,定义了平衡字符串,问这些字符串组合之后,最长的平衡字符子序列的长度. 思路: 首先肯定要把所有字符串先处理成全是不合法的,记录右括号的数量为a,左括号的数量为b, ...

  4. HDU - 6304(2018 Multi-University Training Contest 1) Chiaki Sequence Revisited(数学+思维)

    http://acm.hdu.edu.cn/showproblem.php?pid=6304 题意 给出一个数列的定义,a[1]=a[2]=1,a[n]=a[n-a[n-1]]+a[n-1-a[n-2 ...

  5. 2018 Nowcoder Multi-University Training Contest 2

    目录 Contest Info Solutions A. run D. monrey G. transform H. travel I. car J. farm Contest Info Practi ...

  6. 2018 Nowcoder Multi-University Training Contest 1

    Practice Link J. Different Integers 题意: 给出\(n\)个数,每次询问\((l_i, r_i)\),表示\(a_1, \cdots, a_i, a_j, \cdo ...

  7. 2018 Nowcoder Multi-University Training Contest 5

    Practice Link A. gpa 题意: 有\(n\)门课程,每门课程的学分为\(s_i\),绩点为\(c_i\),要求最多删除\(k\)门课程,使得gpa最高. gpa计算方式如下: \[ ...

  8. 2018 Nowcoder Multi-University Training Contest 10

    Practice Link J. Rikka with Nickname 题意: 给出\(n\)个字符串,要求依次合并两个串\(s, t\),满足将\(t\)合并到\(s\)中变成\(r\),使得\( ...

  9. HDU 6299 Balanced Sequence(贪心)

    题目:给出N个只有左右括号字符串 ,这N个字符串的排列顺序是任意的 , 问按最优的排序后 , 得到最多匹配的括号个数 分析: 我们很容易的想到 字符串)()()(( , 这样的字符串可以精简为)(( ...

随机推荐

  1. ES6:string.raw浅析

    当前正学习ES6 ,遇到string.raw费心思,现将试验后的结果整理如下: 网上得来的试验: 语法 String.raw`templateStr`; String.raw(obj, ...subs ...

  2. Java的常量接口思考,项目中的常量是放在接口里还是放在类里呢?

    最近在看一本书 Java与模式,里面提了一句不建议使用常量接口,甚至举了个java源码的反例, 蛋疼的是没有说为什么? 查了网上一圈发现他们也是知道怎么做而不知道为什么这么做. 然后我只能找谷歌了,翻 ...

  3. 关于office转换成pdf组件服务中的DCOM配置问题

    在开始->运行 中录入“dcomcnfg” 单击“确定”后弹出“组件服务”窗口 依次选择“组件服务”->“计算机”->“我的电脑”->“DCOM配置” 在“DCOM配置”下找到 ...

  4. ABAP事件的简单用法

    1.1.事件: 用于捕获某类对象状态的改变来触发事件的方法,并进行处理 1.2.定义:可以在类或接口中进行声明 EVENTS|CLASS-EVENTS evt  EXPORTING … VALUE(p ...

  5. WebView全面学习(二)-- Native与js双方通信

    WebView全面学习(二)-- Native与js双方通信 Native与js通信的本质 Native与js通信的核心在于WebView. 两端的通信主要还是单向的.假如要完成js->Nati ...

  6. sizeof(int)

    sizeof()操作符检测的是系统为后面()中的类型.变量等分配的内存空间的字节数,这里()中是int,就是求系统为int类型的变量分配几个字节. 在16位int平台下是2:在32位int平台下是4: ...

  7. 拷贝文件至U盘——提示:对于目标系统文件过大

    一.问题描述: 在制作U盘启动工具的时候,通常制作出的U盘文件系统是FAT32,但是当需要拷贝进去的系统文件大小超过4GB时,就会提示上述问题 二.解决办法: 1.格式化U盘,在格式化界面“文件系统” ...

  8. userBean的删除

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  9. Linux下解压ZIP压缩包乱码问题

    并不是所有ZIP文件都是乱码的而且导致解压失败,只有windows下压缩的ZIP在Linux中会出现这种情况.这是因为Windows和Linux下用的字符编码不同.Windows下的编码格式为GBK, ...

  10. setup命令

    setup——配置网络(centos) 命令所在路径:usr/bin/setup 示例1: # setup