C - Move Brackets
题意:一共给你2n个阔号,一半是 '(' ,一半是 ')' 这些括号是乱序的,你可以把某个阔号往最头上或者是最后面放置,问问你最少几次可以把阔号匹配完成。
题解:这个题,你会发现,一个括号往开头放和往结尾放置他的代价是相同的,开阔号的话必然是往开头放,闭括号肯定是往结尾放,那么我么可以选择只动一个类型的阔号,比如说只动闭阔号,我们从头往后遍历,当开阔号数量小于闭阔号数量时,我们选择移动一个闭阔号往右端(同时减去一个闭阔号的数量)。不断记录即可
/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 2e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;
string s;
int main()
{
int t;
cin>>t;
while(t--){
int n;
cin>>n;
cin>>s;
int ans1=0,ans2=0;
int sum=0;
for(int i=0;i<n;i++){
if(s[i]=='(') ans1++;
else ans2++;
if(ans2>ans1) sum++,ans2--;
}
cout<<sum<<endl;
}
return 0;
}

京公网安备 11010502036488号