CF3D Least Cost Bracket Sequence 题解——贪心

题目连接:https://www.luogu.com.cn/problem/CF3D

——————————————————————————————————————————————————————————

这一题是一个贪心的题目。 先把字符串中的问号都换成右括号,扫过去,如果左括号比右括号多(因为在任意一个位置上,它前面的左括号都不可能比右括号多,在最后一位要相等),则在前面所有待定(原是有问号,但现在改成右括号的位子)上找左右差值最小的,换掉(因为只要在一个位置上左括号右括号相等,就是合法的)。

——————————————————————————————————————————————————————————————

代码:

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <queue>
 5 #include <iostream>
 6 #define ll long long
 7 using namespace std;
 8 priority_queue <pair<int,int> > Q;
 9 int a[50010],b[50010];
10 string s;
11 string str;
12 int main(){
13     //freopen("a.in","r",stdin);
14     std::ios::sync_with_stdio(false);
15     cin>>s;
16     int len=0;int l=0,r=0;str=s;
17     for(int i=0;i<s.size();i++){
18         if(s[i]=='(') l++;
19         else if(s[i]==')') r++;
20         if(s[i]=='?'){
21             str[i]=')';
22             cin>>a[i]>>b[i];
23             len++;    
24         }
25     }
26     if(s[0]==')'||s[s.size()-1]=='('){
27         cout<<"-1"<<endl;
28         return 0;
29     }
30     if(abs(l-r)>len){
31         cout<<"-1";
32         return 0;
33     }
34     long long ans=0;
35     l=0,r=0;
36     if(s[0]!='(') str[0]='(';
37     l++;
38     for(int i=1;i<str.size();i++){
39         if(s[i]=='?') Q.push(make_pair(b[i]-a[i],i)); 
40         if(str[i]=='(') l++;
41         if(str[i]==')') r++;
42         if(r>l){
43             pair<int,int> p=Q.top();
44             Q.pop();
45             int x=p.second;
46             r--;l++;
47             str[x]='(';
48         }
49     }
50     if(l!=r){
51         printf("-1");
52         return 0;
53     }
54     if(str[0]!='('||str[str.size()-1]!=')'){
55         printf("-1");
56         return 0;
57     }
58     for(int i=0;i<str.size();i++){
59         if(s[i]=='?'){
60             if(str[i]=='(') ans+=a[i];
61             if(str[i]==')') ans+=b[i];
62         }
63     }
64     cout<<ans<<endl;
65     cout<<str<<endl;
66     return 0;
67 }

这道题需要注意输入输出:

建议用cin和cout

猜你喜欢

转载自www.cnblogs.com/DZN2004/p/12910072.html