cf3d

来源:互联网 发布:php ture还是true 编辑:程序博客网 时间:2024/05/23 21:03

题目链接:http://www.codeforces.com/problemset/problem/3/D

思路:贪心+调整,?就改成')',如果加了')'后发现右括号比左括号多, 就将花费小的括号变成'(',(采用优先队列,默认排序是从大到小);

View Code
 1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 #include<cstring> 5 using namespace std; 6 typedef long long ll; 7 #define MAXN 50005 8  9 10 int main(){11     char str[MAXN];12     while(~scanf("%s",str)){13         priority_queue<pair<int,int> >Q;14         int len=strlen(str),x,y;15         ll ans=0,count=0;16         bool flag=true;17         for(int i=0;i<len;i++){18             if(str[i]=='(')count++;19             else if(str[i]==')')count--;20             else {21                 scanf("%d%d",&x,&y);22                 str[i]=')';23                 count--;24                 Q.push(make_pair(y-x,i));25                 ans+=y;26             }27             pair<int,int>p;28             if(count<0){29                 if(Q.empty()){flag=false;continue;}30                 p=Q.top();Q.pop();//出对列的是最大元素,保证花费最小;31                 ans-=p.first;32                 str[p.second]='(';33                 count+=2;34             }35         }36         (count==0&&flag)?printf("%I64d\n%s\n",ans,str):puts("-1");37     }38     return 0;39 }

 

0 0
原创粉丝点击