列表

详情


NC253619. 括号序列操作专家

描述

氧气少年有一个长度为 n 的括号序列,括号序列只包含左括号 `\tt (' 和右括号 `\tt )'。

一个括号序列是合法的,当且仅当此括号序列可以通过插入加号 `\tt +' 和数字 1 得到一个正确的算术表达式。例如:括号序列 \tt (())()\tt (),和 \tt (()(())) 都是合法的,而 \tt )(\tt (() 和 \tt (()))( 不是合法的。

氧气少年的括号序列不一定是合法的。

月色哥哥是一个括号序列的操作专家,他的任务是帮助氧气少年把这个括号序列变成一个合法的序列。

为了把这个括号序列变合法,月色哥哥每次可以进行下面的操作:


如果无论月色哥哥怎么操作都无法使括号序列变合法,输出 -1;否则请输出他需要做的最少的操作次数。

输入描述

第一行包含一个整数 T(1\leq T \leq 10^5),表示测试用例的组数。

对于每组测试用例:

第一行包含一个整数 n(1\leq n\leq 2\cdot 10^5),表示括号序列的长度。

第二行包含一个长度为 n 的字符串,表示该括号序列。保证字符串只包含左括号 `\tt (' 和右括号 `\tt )'。

保证对于所有的测试用例,n 的总和不超过 2\cdot 10^5

输出描述

对于每组测试用例:

仅输出一行,包含一个整数。如果无论怎么操作都无法使括号序列变合法,输出 -1;否则请输出他需要做的最少的操作次数。

示例1

输入:

3
4
())(
2
((
20
))()())(()()()((())(

输出:

1
-1
17

原站题解

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

C++(g++ 7.5.0) 解法, 执行用时: 31ms, 内存消耗: 800K, 提交时间: 2023-07-15 13:45:29

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
string s;
int sum,n,ans;
void solve(){
    cin>>n>>s;sum=ans=0;
    for(auto x:s){
        if(x=='(')sum++;
        else sum--;
        ans+=max(0ll,(1-sum)/2);
    }
    cout<<(sum?-1:ans)<<endl;
}
signed main(){
    int t=1;cin>>t;
    while (t--)solve();
}

Python3 解法, 执行用时: 222ms, 内存消耗: 5292K, 提交时间: 2023-07-22 20:20:26

import collections


n = int(input())

for _ in range(n):
    m = int(input())
    s = input()
    l , r = 0 , 0
    ans = 0
    for i , w in enumerate(s):
        if w == '(':
            l += 1
        else:
            r += 1
        if r > l and w == ')':
            ans += r - l
    ans = ans if l == r else -1
    print(ans)

C++(clang++ 11.0.1) 解法, 执行用时: 32ms, 内存消耗: 980K, 提交时间: 2023-07-22 13:06:02

#include<bits/stdc++.h>
#define ll long long
using namespace std;
string c;
int main()
{
	int t;cin>>t;
	while(t--)
	{
		int n;cin>>n;cin>>c;
		ll zuo=0;ll sum=0;
		for(int i=0;i<n;i++)
		{
			if(c[i]=='(')zuo++;
			else {
			zuo--;if(zuo<0)sum-=zuo;
			}
		}
		if(zuo)cout<<-1<<endl;
		else cout<<sum<<endl;
	}
}

pypy3 解法, 执行用时: 189ms, 内存消耗: 25836K, 提交时间: 2023-07-14 21:21:00

for _ in range(int(input())):
    input()
    s = str(input())
    cnt, ans = 0, 0
    for c in s:
        if c == '(':
            ans += max(cnt, 0)
            cnt -= 1
        else:
            cnt += 1
    print(ans if cnt == 0 else -1)

上一题