CF3D Least Cost Bracket Sequence 题解——贪心

Posted dzn2004

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于CF3D Least Cost Bracket Sequence 题解——贪心的主要内容,如果未能解决你的问题,请参考以下文章

CF3D Least Cost Bracket Sequence 题解——贪心

Least Cost Bracket Sequence(贪心)

Least Cost Bracket Sequence 思维

codeforces 3D - Least Cost Bracket Sequence(贪心)

Codeforces 3DLeast Cost Bracket Sequence

[LeetCode 1368] Minimum Cost to Make at Least One Valid Path in a Grid