Codeforces495C Treasure(贪心)

题目链接: Treasure

大致题意

给定一个字符串, 仅由’(’ ‘)’ ‘#’ 组成, 且至少包含一个’#’. 你可以在#处添加至少一个’)’. 要求序列中任何位置的前缀和中, '(‘的个数大于等于’)'的个数. 且最终括号匹配.

问能否对于每个#位置给出一种合法的放置个数, 使得满足题目要求. 若不能满足则输出-1.

解题思路

贪心, 很明显的贪心题目, 因为他要求①前缀和左≤右, ②最终序列匹配.

考虑到贪心做法, 我们不妨先假设每个#位置我们都只放1个右括号, 剩下差的括号, 我们都放在最后一个#位置. 那么在从前往后遍历的过程中, 如果出现了右括号多于左括号的情况, 一定不合法.

这样如果我们遍历完整个序列, 没有不合法的位置, 则我们一定存在一种放法, 使得对于任意位置, 左括号的数目≥右括号的数目. 接下来只需要看能否做到括号匹配即可.

括号匹配的前提一定是左右括号的数目相等, 我们记pos为最后一个#出现的位置, 那么我们一定可以使得在#位置处再放置≥0个右括号, 使得左右括号数目相同.

但是此时出现了一个问题, 即我们有可能破坏对于任意位置左括号≥右括号这一性质.
我们不妨记录对于最后一个#, 最多还可以额外放last个右括号, 使得前缀和不被破坏.

AC代码

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 1; i <= (n); ++i)
using namespace std;
typedef long long ll;
int main()
{
	string s; cin >> s;

	vector<int> res;
	int num = 0; bool can = 1; int last = 0;
	for (char & op : s) {
		if (op == '(') num++;
		else if (op == ')') num--;
		else num--, res.push_back(1), last = num;

		if (num < 0) can = 0;
	}


	if (!can or s.back() == '(') printf("-1\n");
	else {
		res.back() += num;
		if (num > last) printf("-1\n");
		else for (auto& op : res) printf("%d\n", op);
	}
	return 0;
}

END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逍遥Fau

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值