题意:给定n个只有左右括号的序列,要求将它们重新排序使得匹配的括号对数最大。

n<=1e5

s[i]<=1e5

sum s[i]<=5e6

思路:

先把每个串内部的匹配数量减去,剩下的就是不匹配的左右括号数量

对于左括号数量大于右括号的串,按右括号数量从小到大排序

对于右括号数量大于左括号的串,按左括号数量从大到小排序

 #include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef vector<int> VI;
#define fi first
#define se second
#define MP make_pair int read()
{
int v=, f=;
char c=getchar();
while (c<||<c) {if(c=='-') f=-; c=getchar();}
while (<=c&&c<=) v=(v<<)+v+v+c-, c=getchar();
return v*f;
} const int N=;
int a[N],b[N],n,ans;
char ch[N];
PII A[N],B[N],C[N]; bool cmp1(const PII &a,const PII &b)
{
return a.fi<b.fi;
} bool cmp2(const PII &a,const PII &b)
{
return a.se>b.se;
} int main()
{ int cas=read();
while(cas--)
{
n=read();
int ans=;
for(int i=;i<=n;i++)
{
scanf("%s",ch+);
a[i]=b[i]=;
int now=;
for(int j=;ch[j];j++)
if(ch[j]==')')
{
if(now) now--,ans++;
else a[i]++;
}
else now++;
b[i]=now;
for(int j=;ch[j];j++) ch[j]=;
}
for(int i=;i<=n;i++) A[i]=MP(a[i],b[i]);
int len1=,len2=;
for(int i=;i<=n;i++)
if(a[i]<b[i]) B[++len1]=A[i];
else C[++len2]=A[i];
sort(B+,B+len1+,cmp1);
sort(C+,C+len2+,cmp2);
int now=;
for(int i=;i<=len1;i++)
{
ans+=min(now,B[i].fi);
now-=min(now,B[i].fi);
now+=B[i].se;
}
for(int i=;i<=len2;i++)
{
ans+=min(now,C[i].fi);
now-=min(now,C[i].fi);
now+=C[i].se;
}
printf("%d\n",ans*);
}
return ;
}

最新文章

  1. 微信小程序-视图模板
  2. php dirname(__FILE__) 获取当前文件的绝对路径 (转)
  3. EGO Refresh小总结
  4. 免费在线客服QQ_网页接入及使用说明
  5. Node.js深受欢迎的六大原因
  6. 540B :School Marks
  7. php测试代码工具类
  8. Python 一路走来 DOM &amp; Jquery
  9. java设计模式-工厂模式(springweb为例子)
  10. nodejs轻量级时间格式化组件Moment.js的使用例子
  11. 使用sftp操作文件并添加事务管理
  12. lock 单例模式
  13. SpringBoot之配置文件加载位置
  14. TCP协议和UDP协议基础介绍
  15. eclipse怎么删除多余的tomcat server(2)
  16. window service 开发
  17. VS 星期作业 if else的应用 做一个受不受异性欢迎的小程序
  18. SSM项目 单元测试中 注入bean 空指针异常
  19. Jmeter(三十九)获取响应结果中参数出现的次数(转载)
  20. 37.Linux驱动调试-根据oops的栈信息,确定函数调用过程

热门文章

  1. Java&amp;Xml教程(十一)JAXB实现XML与Java对象转换
  2. 个人作业(alpha)
  3. LibreOJ #101. 最大流
  4. javaee 第七周作业
  5. (转)@Autowire注解与自动装配
  6. oracle的Hint
  7. MFC实现类似spy++dm取句柄功能
  8. Android开发案例 - 淘宝商品详情【转】
  9. treetable
  10. QT5:第二章 布局排版控件