CF 3D Least Cost Bracket Sequence
来源:互联网 发布:webpack搭建php服务器 编辑:程序博客网 时间:2024/05/17 01:25
题目大意:给一个括号序列,其中有一些位置是问号,问号可以变成左括号或右括号,每个问号变成其中一种符号都有代价。求代价最小的合法括号序列的代价以及序列。
题解:这个问题是有后效性的,因为后面的决策不取决于前面的某一个阶段的状态,而是与之所有阶段的状态都有关,不能用dp来解。正解是贪心,先假设所有的问号都是右括号,如果某个位置不合法了,检查前面是否有问号,如果有的话找一个代价最小的进行纠正,否则一定无法构成正确的序列。
#include <bits/stdc++.h>using namespace std;const int maxn = 50100;struct node{ int idx,a,b; node(int i,int x,int y):idx(i),a(x),b(y){} node(){} bool operator<(const node &x)const { return a-b>x.a-x.b; }};priority_queue<node> Q;typedef long long ll;int a[maxn],b[maxn];int id[maxn];char str[maxn];int main(){ scanf("%s",str); int len = strlen(str); int n = 0; for(int i = 0;i < len;i++) if(str[i] == '?'){ str[i] = ')'; id[n++] = i; } ll ans = 0; int cnt = 0; bool flag = true; for(int i = 0;i < n;i++) scanf("%d%d",&a[i],&b[i]),ans +=b[i]; for(int i = 0,j = 0;i < len;i++){ if(i == id[j]){ Q.push(node(i,a[j],b[j])); j++; } if(str[i] == '(') cnt++; if(str[i] == ')') cnt--; if(cnt < 0){ if(!Q.empty()){ node tmp = Q.top(); Q.pop(); ans += tmp.a-tmp.b; cnt += 2; str[tmp.idx] = '('; } else{ flag = false; break; } } } if(cnt>0) flag = false; if(!flag){ printf("-1\n"); return 0; } printf("%I64d\n",ans); printf("%s\n",str); return 0;}
0 0
- CF 3D Least Cost Bracket Sequence
- CF 3D Least Cost Bracket Sequence
- CodeForces 3D Least Cost Bracket Sequence
- codeforces 3D Least Cost Bracket Sequence
- Codeforces 3D. Least Cost Bracket Sequence
- CodeForces 3D. Least Cost Bracket Sequence
- CodeForces 3D-Least Cost Bracket Sequence
- CodeForces 3D Least Cost Bracket Sequence
- Codeforces 3D Least Cost Bracket Sequence
- D. Least Cost Bracket Sequence
- Codeforces 3D Least Cost Bracket Sequence 贪心
- Codeforces 3D Least Cost Bracket Sequence (贪心)
- Codeforces 3D Least Cost Bracket Sequence --- 贪心
- Codeforces Beta Round #3 D. Least Cost Bracket Sequence
- codeforce 3D. Least Cost Bracket Sequence(贪心)
- Codeforces 3D Least Cost Bracket Sequence [贪心]
- Codeforces 3D Least Cost Bracket Sequence(贪心)
- Codeforces Beta Round #3 D. Least Cost Bracket Sequence
- 104. Maximum Depth of Binary Tree (二叉树最大深度)
- HUE3.10本地安装
- drawText的坐标问题
- 三种方式记录bash输出的内容
- HDOJ 1874 畅通工程续(最短路)
- CF 3D Least Cost Bracket Sequence
- NOIP算法总结——关于简单 线性动态规划
- C++动态内存操作
- 107. Binary Tree Level Order Traversal II (二叉树由底向上层次遍历)
- Day53、表连接、合并结果集、组函数和分组、子查询、表操作(创建、删除、更新)、事务控制语句
- OSG开源教程
- 欢迎使用CSDN-markdown编辑器
- C++与设计模式(2)--策略模式
- 110. Balanced Binary Tree (平衡二叉树判断)