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)