牛客OI赛制测试2 E括号游戏 - 贪心

本文介绍了一种算法,用于计算将乱序括号序列调整为正确匹配所需的最小交换次数。该算法采用贪心策略,通过删除已匹配的括号对来简化问题,并针对剩余未匹配的括号进行有效计算。

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

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

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

输入描述:

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

输出描述:

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

示例1

输入

复制

6
(()))(

输出

复制

1

示例2

输入

复制

6
)))(((

输出

复制

2

备注:

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

思路:

用贪心的思想:

1、当括号已经匹配时,我们不去动它

2、我们将所有已匹配的括号删去,那么剩下的一定是:))))((((           类似这种,因为题中“匹配”是')'前必有'('那么不匹配就是')'在前,'('在后

3、我们交换一次,可以匹配两对

若剩下的括号是偶数对,那么交换次数是:dui/2

若剩下的括号是奇数对,那么交换次数是:dui/2+1,多了中间一对的交换

代码如下:

#include<bits/stdc++.h>
using namespace std;

int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        stack<char>ss;
        getchar();
        for(int i=0;i<n;i++){
            char ch=getchar();
            if(ch=='(')ss.push('(');
            else{
                if(ss.size()==0)ss.push(')');
                else if(ss.top()=='(')ss.pop();
                else ss.push(')');
            }
        }
        int dui=ss.size()/2;
        if(dui%2){//剩下奇数对
            printf("%d\n",dui/2+1);
        }
        else{
            printf("%d\n",dui/2);
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值