这是一个好题
要想保证括号的合法性,就得在遇到一个括号的时候就判断之前的左括号是不是少于右括号,如果少于就给他扳过来。
#include <iostream>
#include <string>
#include <queue>
using namespace std;
class node{
public:
long long p,idx;
node( long long ap=0 ): p(ap),idx(0) {}
bool operator<(const node& a) const { return p<a.p; }
};
priority_queue<node> q;
int main()
{
string s;
cin >> s;
int ln=0;
int len=s.size();
long long cost=0;
for( int i=0;i<len;i++ )
{
if(s[i]=='(') ln++;
else if(s[i]==')') ln--;
else
{
long long cl,cr;
cin >> cl >> cr;
cost+=cr;
node t;
t.p=cr-cl;
t.idx=i;
q.push(t);
s[i]=')';
ln--;
}
if( ln<0 )
{
if(q.empty()) break;
node t=q.top();
q.pop();
s[t.idx]='(';
cost-=t.p;
ln+=2;
}
}
if(ln!=0)
{
cout << -1 << endl;
return 0;
}
cout << cost << endl;
cout << s << endl;
return 0;
}