经典的贪心题目,解决问题的方法很值得深思,值得收藏~~
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 55555;
char str[MAXN];
struct Node
{
int val, id;
Node() {}
Node(int t_val, int t_id) : val(t_val), id(t_id) {}
friend bool operator < (const Node &p1, const Node &p2)
{
return p1.val < p2.val;
}
};
priority_queue<Node> que;
int main()
{
//freopen("aa.in", "r", stdin);
//freopen("bb.out", "w", stdout);
int a, b; Node t;
long long ans = 0; int cnt = 0;
scanf("%s", str); int len = strlen(str);
for(int i = 0; i < len; ++i)
{
if(str[i] == '(')
{
cnt++;
}
else if(str[i] == ')')
{
cnt--;
}
else if(str[i] == '?')
{
cin >> a >> b;
cnt--;
str[i] = ')';
ans += b; que.push(Node(b - a, i));
}
if(cnt < 0) //对当前右括号的数目大于左括号数目的情况,利用优先队列中的右括号进行消去
{
if(que.empty()) //非法的情况
break;
t = que.top(); que.pop();
ans -= t.val; cnt += 2; str[t.id] = '(';
}
}
if(cnt != 0)
cout << "-1" << endl;
else
{
cout << ans << endl;
for(int i = 0; i < len; ++i)
{
cout << str[i];
}
}
cout << endl;
return 0;
}