Codeforces Round #653 (Div. 3)C - Move Brackets
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; }
题解 文章被收录于专栏
主要写一些题目的题解