列表

详情


NC223446. 好哥哥

描述

给定一段合法括号序列和元钱,合法括号序列的定义如下:

1. 是合法的括号序列。

2.若字符串是合法的括号序列,那么也是合法的括号序列。

3.若字符串,是合法的括号序列,那么也是合法的括号序列。

我们设定表示第对括号的层数,即:它前面有多少未匹配的左括号。同时规定一对括号是另一对括号的好哥哥,当且仅当且括号在括号内。

如果当前位于一对括号,每次可以花费元跳到:

1. 它的任意一个好哥哥。

2. 一对括号,要求的好哥哥是

假如一开始位于第一对括号,请问最多可以经过多少对不重复的括号?

输入描述

第一行两个正整数,表示括号对数,表示钱的数量,其中,

接下来一行输入长度为的括号序列。

输出描述

输出最多可以经过多少对不重复的括号。

示例1

输入:

5 2
((((()))))

输出:

3

示例2

输入:

9 5
((()(()()))(()()))

输出:

5

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 301ms, 内存消耗: 9996K, 提交时间: 2021-07-18 19:44:13

#include<bits/stdc++.h>
using namespace std;
int v,n,cnt;
int main(){
	scanf("%d%d\n",&v,&n);
	int s=0,ma=0;
	for(int i=1;i<=2*v;i++){
		if(getchar()=='(')s++;
		else s--,cnt++;
		ma=max(ma,s);
		if(s==0)break;
	}
	if(n<=ma-1){
		cout<<n+1;
		return 0;
	}
	else cout<<min(cnt,(int)(n-ma+1)/2+ma);
	return 0;
}

pypy3 解法, 执行用时: 713ms, 内存消耗: 107988K, 提交时间: 2021-07-20 11:49:40

v, n = map(int, input().split())
a = input()
s, num, mx, ans = 0, 0, 0, 0
for i in range(0, 2 * v):
    if a[i] == '(':
        s, num = s + 1, num + 1
    else:
        s -= 1
    if s == 0:
        break
    mx = max(mx, s)
if n + 1 < num:
    num = n + 1
ans = min(num, mx + (n + 1 - mx) // 2)
print(ans)

上一题