当前位置: 首页 > article >正文

贪心 D. Least Cost Bracket Sequence

Problem - D - Codeforces

题目大意:给一个只包含()?三个字符的字符串。每个?可以转为(或者),对于第 i i i?转为(需要花费 a i a_i ai,转为)需要花费 b i b_i bi。现在问能否让该字符串转为合法的括号匹配,如果可以找到最小花费并输出转为的括号匹配。

思路:?的情况可以转为(,也可以转为),是动态的,处理起来麻烦。我们可以将?全都先转为同一种,记录总花销,之后根据情况替换为另一个,这样虽然也是动态的,但是要维护的状态少了很多。

在此,将?先全部转为),对于中间态而言,左边(可以多,但是)数量一定小于等于左边。用括号匹配的类似操作进行计数,(进行累加计数,对于其他的,如果是?先贪心的转为),之后让计数减一。根据计数值进行贪心的更改:将原来?)的替换为(,并将计数值和字符串状态进行更新。贪心的时候需要找到中间值 i i i前面的? a i − b i a_i - b_i aibi最小那个?进行转换。

代码如下:

void solve() {
	string s; cin>>s;
	priority_queue<PII> heap;
	int n = s.size();
	vector<array<int,2>> a(n); // (val, )val
	int ans = 0;
	// 先得到 ? -> ) 的总花销
	for(int i = 0; i < n; ++i) {
		if(s[i] == '?') {
			cin>>a[i][0]>>a[i][1];
			ans += a[i][1];
		}
	}
	// 判断括号序列是否合法
	bool ok = 1;
	int cnt = 0; // 计数

	for(int i = 0; i < n; ++i) {
		if(!ok) break;
		if(s[i] == '(') cnt++;
		else {
			// 如果不是 ( 优先转为 ) ,并计算差值,
			cnt--;
			if(s[i] == '?') heap.push({a[i][1] - a[i][0], i}), s[i] = ')';
			// 如果是计数是负数
			// 将前面的 ( ? -> ) ) -> ( 转为 (
			// 并更新计数和字符串值
			if(cnt < 0) {
				if(heap.size() == 0) ok = 0;
				else {
					auto tmp = heap.top(); heap.pop();
					ans -= tmp.first;
					cnt += 2;
					s[tmp.second] = '(';
				}
			}
		}
	}
	if(cnt || !ok) puts("-1");
	else {
		cout<<ans<<'\n';
		cout<<s<<'\n';
	}
}

http://www.kler.cn/a/144822.html

相关文章:

  • 【LeeCode】283.移动零
  • 【数据结构实验】图(一)Warshall算法(求解有向图的可达矩阵)
  • Mono 8、Mono 10、Mono 10 Packed、Mono 12、Mono 12 Packe等像素格式简介
  • VR全景展示,“超前点播”打开娱乐行业线上营销门户
  • 使用fetch封装get与post方法
  • 百战python04-循环结构
  • 查找学习笔记
  • 【微服务专题】SpringBoot自动配置简单源码解析
  • nodejs微信小程序+python+PHP-健身俱乐部在线管理平台的设计与实现-安卓-计算机毕业设计
  • SLAM ORB-SLAM2(9)闭环检测器
  • Echarts 创建饼状图-入门实例
  • 车载通信架构 —— 传统车内通信网络FlexRay(较高速度高容错、较灵活拓扑结构)
  • 【云备份】文件操作实用工具类设计
  • DRF-项目-(1):构建纯净版的drf项目,不再使用django的后台管理,django的认证,django的session等功能,作为一个纯接口项目
  • 四边形不等式优化DP
  • 策略模式应用(内窥镜项目播放不同种类的视频)
  • 技术分享 | 在 IDE 插件开发中接入 JCEF 框架
  • 百度 文心一言 sdk 试用
  • 运维高级--centos7源码安装Apache
  • ubuntu+Teslav100 环境配置