Codeforces 3D Least Cost Bracket Sequence 貪心

這是一個好題

要想保證括號的合法性,就得在遇到一個括號的時候就判斷之前的左括號是不是少於右括號,如果少於就給他扳過來。

#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章