题目大意:

这是一个规则的字符括号序列。一个括号序列是规则的,那么在序列里面插入‘+’ 和 ‘1’ 会得到一个正确的数学表达式。
合法:(())(), (),(()(()))
不合法:)(,((),(()))(
给你一个字符序列,里面包含‘(’,‘)’ 和‘?’
我们需要替换所有的‘?’,替换为“(” 和 ‘)’,在所有可能中找到花费最小的。
输入数据:
首先是一个字符串。
然后是m行,每行两个数字ai, 和 bi。
分别代表将第i个问号换为'(' 和‘)’ 的花费。
如果不能得到匹配的串则输出 -1.
==================================================================================================================================================================================
题目解析:
我们遍历串,把所有‘?’变为‘)’, 我们使用一个计数器 cnt, 遇到‘(’ 就 +1, 遇到‘)’ 就 -1.
当我们的cnt为 负数的时候,说明我们必须把前面的一个‘)’变为‘(’才行,这个时候我们需要一个优先队列来存储最优值。其余的自己想想应该就明白了。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
using namespace std;
typedef __int64 LL;
const LL INF = 1e9+;
const LL MOD = 1e9+;
const LL maxn = ;
char str[maxn];
LL n;
struct node
{
int a, b, c;
int Index;
bool friend operator < (node B,node A)
{
return A.c < B.c;
}
} P[maxn]; LL solve()
{
LL k = , ans = , cnt = ;
priority_queue<node> Q;
node Pn;
for(int i=; str[i]; i++)
{
if(str[i] == '?')
{
Q.push(P[k]);
ans += P[k].b;
str[i] = ')';
k ++;
cnt --;
}
else if(str[i] == '(')
cnt ++;
else
cnt --; if(cnt < )
{
while(Q.size() && cnt < )
{
Pn = Q.top();
Q.pop();
cnt += ;
ans = ans - Pn.b + Pn.a;
str[Pn.Index] = '(';
}
}
if(cnt < )
return -;
}
if(cnt > )
return -;
return ans;
} int main()
{
scanf("%s", str); for(int i=; str[i]; i++)
{
if(str[i] == '?')
{
scanf("%d %d", &P[n].a, &P[n].b);
P[n].c = P[n].a - P[n].b;
P[n ++].Index = i;
}
}
LL ans = solve(); printf("%I64d\n", ans); if(ans != -)
puts(str); return ;
}

最新文章

  1. 禁用SQL Server Management Studio的IntelliSense
  2. CSS创建三角形(小三角)的几种方法
  3. 横屏EditText问题
  4. Maven2的配置文件settings.xml(转)
  5. Putty 工具 保存配置的 小技巧
  6. lightoj1104(数学概率与期望)
  7. [React Native] Create a component using ScrollView
  8. linux中切换用户方式su和su -的区别
  9. validate()的配置项
  10. VS2003,安装程序检测到另一个程序…
  11. 如何在网页标题栏title加入logo图标?
  12. Asp.net导出Excel/Csv文本格式数据
  13. Core Animation 文档翻译 (第二篇)
  14. XMPP系列(二)----用户注册和用户登录功能
  15. Java 7 和 Java 8 中的 HashMap原理解析
  16. windows bat 批处理 执行 for 循环无法执行?
  17. extjs 跨域 ajax.request
  18. java编码与解码(一)
  19. Unity下一轮最大的变革-Entity Component System &amp; C# Jobs System
  20. 让终端走socks5代理

热门文章

  1. Java基础知识强化之集合框架笔记41:Set集合之HashSet存储自定义对象并遍历练习
  2. php 两个数组是否相同,并且输出全面的数据,相同的加一个字段标示
  3. eclipse(myEclipse) 配置maven项目
  4. mybatis for .net
  5. 在treeview外加一个滚动条的实现
  6. 对UIImage进行的一些操作
  7. iOS LaunchScreen设置启动图片,启动页停留时间
  8. 解决ld: warning: directory not found for option警告
  9. 搞一个app需要多久?
  10. iOS中JavaScript和OC交互