牛客oi赛制测试赛2E——括号序列

链接:https://www.nowcoder.com/acm/contest/185/E
来源:牛客网
 

给定括号长度N,给出一串括号(只包含小括号),计算出最少的交换(两两交换)次数,使整个括号序列匹配。
我们认为一个括号匹配,即对任意一个')',在其左侧都有一个'('与它匹配,且他们形成一一映射关系。

输入描述:

第一行:整数N,表示括号序列长度
第二行:一个字符串,表示括号

输出描述:

一个整数,表示最少的交换次数

示例1

输入

复制

6
(()))(

输出

复制

1

示例2

输入

复制

6
)))(((

输出

复制

2

备注:

对于80%的数据:n≤3000
对于100%的数据,n≤5×106

大致思路:我们可以用一个栈来模拟全过程,把每一个“(”的括号入栈,然后在把能够完成匹配的出栈,最后返回栈里的元素个数k,这时候栈里的元素个数就表示为匹配的“( ”。我们可以动手模拟一下))((,这个时候k = 2,我们只需要交换两边就行了,操作数目为1,)))(((,这个时候 k = 3,我们可以依次交换两边的括号,操作数为 2.所以操作数 = k + (k & 1).

#include <bits/stdc++.h>
using namespace std;
int main(int argc, char const *argv[])
{
	stack<char> st;
	char ch;
	int n;
	scanf("%d",&n);
        //while(!st.empty()) st.pop();
		while(n--){
			cin>>ch;
			if(ch == '('){
				st.push(ch);
			}
			else{
				if(!st.empty()){
					st.pop();
				}
			}
		}
		//printf("%d\n",k);
        int k = st.size();
       // printf("%d\n",k);
        if(k == 0) printf("%d\n",k);
        else if(k > 0 && k <= 2){
            printf("1\n");
        }
        else if(k > 2){
            printf("%d\n",k / 2 + (k & 1));
        }
	return 0;
}

猜你喜欢

转载自blog.csdn.net/xiang_hehe/article/details/82597911
今日推荐