5 条题解

  • 3
    @ 2023-8-13 13:14:06

    可以参考一下这道题:CF26B

    直接遍历括号串,用 cntcnt 表示当前未匹配的左括号,用 ansans 表示最长匹配括号串的长度。如果遇到左括号就将 cnt+1cnt+1,如果遇到右括号并且前面还有未匹配的左括号(cnt>0cnt>0),就将 cnt1cnt-1,并将 ans+2ans+2

    最终答案就是 sans|s|-ans

    #include <bits/stdc++.h>
    #define ll long long
    #define rll register ll
    #define cll const ll
    #define N 10000005
    using namespace std;
    inline ll read()
    {
        rll x=0;bool f=1;register char c=getchar();
        while(c<48||c>57){if(c=='-') f=0;c=getchar();}
        while(c>=48&&c<=57){x=x*10+(c^48);c=getchar();}
        return f?x:-x;
    }
    inline void write(ll x)
    {
        if(x<0) putchar('-'),x=-x;
        if(x>9) write(x/10);
        putchar(x%10+48);
    }
    ll n,cnt,ans;
    char s[N];
    int main()
    {
        scanf("%s",s+1),n=strlen(s+1);
        for(rll i=1;i<=n;i++)
        {
            if(s[i]=='(') cnt++;
            else if(cnt) ans+=2,cnt--;
        }
        write(n-ans);
        return 0;
    }
    
  • 0
    @ 2023-1-2 10:48:22

    思路很简单,检测到是"("就加入栈,是")"就pop()

    需要注意

    当多出"("时,该怎么办······
    当多出")"时,该怎么办······

    #include <iostream>
    #include <stack>
    using namespace std;
    long long sum;//记录答案
    long long num;//t数组的数量
    long long b;//不知道为什么a.length()放在for循环里就不行了
    string a;
    stack <char> t;
    int main()
    {
        cin >> a;
        b = a.length();
        for(int i = 0;i < b;i++)//遍历字符串a
        {
            if(a[i] == '(')
            {
                t.push(a[i]);
                num++;
            }
            else
            {
                if(t.empty())
                {
                    sum++;
                }
                else
                {
                    t.pop();
                    num--;
                }
            }
        }
        sum += num;
        cout << sum;
        return 0;
    }
    
  • -1
    @ 2023-3-26 16:33:35
    for (int i=0;i<s.length();i++)
        if (s[i]=='(')
            st.push(7);//这里可以随便加一个自己喜欢的数字,对结果没有影响
        else
            if (st.empty())//判断是否有没有'('匹配的')'
                ans++;
            else
                st.pop();
    cout<<ans+st.size();//多出来的'('加上多出来的')'
    
    • -2
      @ 2022-5-4 12:52:11

      #include <bits/stdc++.h> using namespace std; string s; int n1,n2; stack<char> a; int main() { cin>>s; for(int i=0;i<s.length();i++) { a.push(s[i]); if(s[i]'(') n1++; else n2++; } if(n1n2) cout<<0; else if(n1>n2||n2>n1) cout<<abs(n1-n2); return 0; }

      • -4
        @ 2022-12-18 18:38:38

        写题解请注意

        鼓励大家写题解,但注意题解格式。

        题解一定要有思路解析或代码注释,能否让别人理解你的思路

        也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。

        给代码两端加上这个会舒服一些

        ```cpp

        你的代码

        ```

        </span>

        这个点在键盘的左上角tab上面那个键,注意切换输入法

        #include<iostream>
        using namespace std;
        int main()
        {
        int n;
        cin>>n;//这是一个注释
        return 0;
        }
        

        请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

        抄袭题解一经发现直接取消成绩。

        题解被删除的可能

        1. 代码不符合格式规范
        2. 没有思路讲解或者没有注释,
        3. 无意义的题解

        大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。

      • 1

      信息

      ID
      1415
      时间
      1000ms
      内存
      256MiB
      难度
      4
      标签
      递交数
      221
      已通过
      95
      上传者